如何在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
相关产品推荐
相关产品推荐

