问题描述
我只是想知道是否可以取消 GCP 存储客户端 UploadobjectAsync
?
基本上,我正在运行一个带有从 UploadobjectAsync
调用 backgroundWorker1_DoWork
的后台工作者的 winforms 应用程序。我原以为调用 backgroundworker.CancelAsync()
就这么简单,但现在我意识到我还需要取消上传。由于它是异步上传,有没有办法设置一个取消请求的标志?
private void cancelLoadBttn_Click(object sender,EventArgs e){
// Cancel the asynchronous operation.
this.backgroundWorker1.CancelAsync();
setResultLabelText("Upload Cancelled");
// disable the Cancel button.
cancelLoadBttn.Enabled = false;
}
backgroundworker1_doWork
private void backgroundWorker1_DoWork(object sender,DoWorkEventArgs e,string projectID,string bucketName,GoogleCredential credentials,string filePath)
{
// Get the BackgroundWorker that raised this event.
BackgroundWorker worker = sender as BackgroundWorker;
/
if (!e.Cancel) {
UploadAsync(projectID,bucketName,credentials,filePath);
}
}
上传异步
public async void UploadAsync(string projectID,string filePath,string objectName = null)
{
var newObject = new Google.Apis.Storage.v1.Data.Object
{
Bucket = bucketName,Name = System.IO.Path.GetFileNameWithoutExtension(filePath),ContentType = "text/csv"
};
// Instantiates a client.
using (var storageClient = Google.Cloud.Storage.V1.StorageClient.Create(credentials))
{
if (!backgroundWorker1.CancellationPending)
{
try
{
// Open the image file filestream
using (var fileStream = new System.IO.FileStream(filePath,System.IO.FileMode.Open))
{
setMax((int)fileStream.Length);
// set minimum chunksize just to see progress updating
var uploadobjectOptions = new Google.Cloud.Storage.V1.UploadobjectOptions
{
ChunkSize = Google.Cloud.Storage.V1.UploadobjectOptions.MinimumChunkSize
};
// Hook up the progress callback
var progressReporter = new Progress<Google.Apis.Upload.IUploadProgress>(OnUploadProgress);
objectName = objectName ?? Path.GetFileName(filePath);
/*storageClient.Uploadobject*/
await storageClient.UploadobjectAsync(
bucketName,objectName,null,fileStream,uploadobjectOptions,progress: progressReporter);
Console.WriteLine($"Uploaded { objectName}.");
fileStream.Close();
}
}
catch (Google.GoogleApiException e)
when (e.Error.Code == 409)
{
// When creating the bucket - The bucket already exists. That's fine.
Console.WriteLine(e.Error.Message);
}
catch (Exception e)
{
// other exception
Console.WriteLine(e.Message);
}
}
}
}
解决方法
正如您在 documentation for UploadObjectAsync
中看到的,该方法接受一个 CancellationToken
作为参数,您没有在代码中使用它,如果您想取消该方法生成的任务你需要令牌。
我找到了关于如何在任务中实现取消令牌的.Net documentation,这正是您在这种情况下需要做的。
基本上,您需要实现的是创建一个 CancellationToken
,如 .Net 文档示例中所述,将其用作 UploadObjectAsync
方法的参数,该方法将返回一个 {{1 }},当你想取消上传时,取消Task<Object>
的tokenSource,文档中也有说明。