如何取消 Google Cloud StorageClient UploadObjectAsync?

问题描述

我只是想知道是否可以取消 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,文档中也有说明。