C# 如何取消Google Cloud StorageClient UploadObjectAsync?
我只是想知道是否可以取消GCP存储客户端C# 如何取消Google Cloud StorageClient UploadObjectAsync?,c#,winforms,google-cloud-storage,C#,Winforms,Google Cloud Storage,我只是想知道是否可以取消GCP存储客户端UploadObjectAsync 基本上,我运行的是一个winforms应用程序,backgroundworker从backgroundWorker1\u-DoWork调用UploadObjectAsync。我原以为只要调用backgroundworker.CancelAsync()就可以了,但现在我意识到我也需要取消上传。既然是异步上传,有没有办法设置一个取消请求的标志 取消backgroundworker的我的代码 private void canc
UploadObjectAsync
基本上,我运行的是一个winforms应用程序,backgroundworker从backgroundWorker1\u-DoWork
调用UploadObjectAsync
。我原以为只要调用backgroundworker.CancelAsync()
就可以了,但现在我意识到我也需要取消上传。既然是异步上传,有没有办法设置一个取消请求的标志
取消backgroundworker的我的代码
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;
}
背景工程
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 bucketName, GoogleCredential credentials, 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);
}
}
}
}
public async void UploadAsync(string projectID、string bucketName、GoogleCredential凭证、string filePath、string objectName=null)
{
var newObject=new Google.api.Storage.v1.Data.Object
{
Bucket=bucketName,
Name=System.IO.Path.GetFileNameWithoutExtension(filePath),
ContentType=“text/csv”
};
//实例化一个客户端。
使用(var-storageClient=Google.Cloud.Storage.V1.storageClient.Create(凭证))
{
如果(!backgroundWorker1.CancellationPending)
{
尝试
{
//打开图像文件filestream
使用(var fileStream=new System.IO.fileStream(filePath,System.IO.FileMode.Open))
{
setMax((int)fileStream.Length);
//设置最小chunksize以查看更新进度
var uploadObjectOptions=new Google.Cloud.Storage.V1.uploadObjectOptions
{
ChunkSize=Google.Cloud.Storage.V1.UploadObjectOptions.MinimumChunkSize
};
//连接进度回调
var progressReporter=新进展(OnUploadProgress);
objectName=objectName??Path.GetFileName(filePath);
/*storageClient.UploadObject*/
等待storageClient.UploadObjectAsync(
bucketName,
对象名称,
无效的
文件流,
上载对象选项,
进展:进展报告员);
WriteLine($“上传{objectName}”);
fileStream.Close();
}
}
catch(Google.GoogleApiException e)
当(e.Error.Code==409)
{
//当创建bucket时,bucket已经存在了,这很好。
Console.WriteLine(即错误消息);
}
捕获(例外e)
{
//其他例外
控制台写入线(e.Message);
}
}
}
}
正如您在中所看到的,该方法接受CancellationToken
作为参数,您在代码中没有使用该参数,如果您想取消该方法生成的任务,则需要该标记
我已经找到了一个关于如何在任务中实现取消令牌的方法,这正是本例中需要做的
基本上,您需要实现的是创建一个
CancellationToken
,如.Net文档示例中所述,将其用作UploadObjectAsync
方法的参数,该方法将返回一个任务
,当您想要取消上载时,取消取消令牌的令牌源,文档中也有解释。@KennethRingo这样做吗?@RafaelLemos谢谢。这正是我要找的。@KennethRingo很高兴能帮上忙:)