You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Drive API中取消UWP平台的文件上传?

Google Drive UWP上传取消功能实现方案

要实现真正的上传终止,核心是利用Google Drive .NET API提供的异步上传重载或中断请求的方法,以下是具体解决方案:

关键问题分析

你之前的尝试仅在ProgressChanged中检查取消令牌,只能停止进度反馈,无法中断底层的上传连接和数据传输。原因在于你使用了同步的Upload()方法,该方法不支持直接传入取消令牌,且API内部不会响应令牌状态。

解决方案一:异步上传+传入CancellationToken(推荐)

改用UploadAsync()异步重载方法,该方法支持传入CancellationToken,API内部会监听令牌状态,一旦触发取消就直接中断上传进程,是UWP平台下最规范的实现方式。

修改后的完整代码

public async Task<string> UploadFileToDriveAsync(string path, IProgress<IUploadProgress> prog, CancellationToken cancellationToken)
{
    try
    {
        // 替换同步.Result为await,避免UWP死锁
        StorageFile file = await StorageFile.GetFileFromPathAsync(path);
        string fileId = string.Empty;

        var fileMetadata = new Google.Apis.Drive.v3.Data.File()
        {
            Name = Path.GetFileName(file.Path),
            MimeType = "application/octet-stream"
        };

        using (var stream = await file.OpenStreamForReadAsync())
        {
            var request = this.drive.Files.Create(fileMetadata, stream, "application/octet-stream");

            request.ProgressChanged += (IUploadProgress progressInfo) =>
            {
                // 取消状态下停止进度报告
                if (cancellationToken.IsCancellationRequested)
                    return;

                switch (progressInfo.Status)
                {
                    case UploadStatus.Completed:
                        Debug.WriteLine($"上传完成!");
                        prog.Report(progressInfo);
                        break;
                    case UploadStatus.Failed:
                        Debug.WriteLine($"上传失败");
                        prog.Report(progressInfo);
                        break;
                    case UploadStatus.Uploading:
                        Debug.WriteLine($"{Math.Round(progressInfo.BytesSent / (1024.0 * 1024.0), 2)} MB已上传");
                        prog.Report(progressInfo);
                        break;
                }
            };

            request.ChunkSize = 262144;
            // 传入取消令牌,API内部处理上传中断
            await request.UploadAsync(cancellationToken);

            var uploadedFile = request.ResponseBody;
            Debug.WriteLine($"文件已上传: {uploadedFile.Name} ({uploadedFile.Id})");

            fileId = uploadedFile.Id;
            return fileId;
        }
    }
    catch (OperationCanceledException)
    {
        Debug.WriteLine("上传已取消");
        // 可在此添加取消后的清理逻辑,比如删除已上传的部分文件(需额外调用Drive API)
        throw;
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"上传错误: {ex.Message}");
        throw;
    }
}

使用方式

调用该方法时,通过CancellationTokenSource生成令牌,需要取消时调用Cancel()即可:

var cts = new CancellationTokenSource();
// 启动上传任务
var uploadTask = UploadFileToDriveAsync(filePath, progress, cts.Token);
// 需要取消时执行
cts.Cancel();

解决方案二:同步上传+注册Abort回调(不推荐)

如果必须使用同步上传,可通过CancellationToken.Register()注册回调,调用请求的Abort()方法中断上传:

// 在创建request后添加
cancellationToken.Register(() => request.Abort());

// 原同步上传代码
request.Upload();

该方法能终止上传,但同步调用在UWP中可能导致UI线程阻塞,不建议使用。

内容的提问来源于stack exchange,提问作者Ariel P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:07:53