Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何取消Google Cloud StorageClient UploadObjectAsync?_C#_Winforms_Google Cloud Storage - Fatal编程技术网

C# 如何取消Google Cloud StorageClient UploadObjectAsync?

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

我只是想知道是否可以取消GCP存储客户端
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很高兴能帮上忙:)