UWP中使用Google Drive API的实现方案及稳定性疑问
UWP中使用Google Drive API的可行方案及同步调用疑问解答
问题背景
在查找UWP环境下使用Google Drive API的方案时,发现已有公开方案无法直接生效,最终通过自行编写代码实现了功能。
实现代码
初始化Drive服务
// StorageFile tempfile = 凭据文件的存储路径 var credential = GoogleCredential.FromFile(tempfile.Path) .CreateScoped(new[] { DriveService.ScopeConstants.DriveFile }); var service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "你的应用名称" });
文件上传示例
using (var stream = tempfile.OpenStreamForReadAsync().Result) { var request = service.Files.Create(fileMetadata, stream, "application/octet-stream"); request.Upload(); var uploadedFile = request.ResponseBody; Debug.WriteLine($"文件已上传: {uploadedFile.Name} ({uploadedFile.Id})"); }
关于同步调用的疑问解答
你用.Result和.AsTask().Wait()替代await的写法,并非仅在调试模式下有效,但需要明确以下关键点:
- 这种同步阻塞写法在UWP中存在死锁风险,尤其是在UI线程中调用时——UWP的UI线程是单线程公寓(STA)模型,阻塞会导致线程无法处理消息循环,进而引发界面冻结甚至死锁。
- Google Drive .NET API本身完全支持异步调用,官方推荐使用
await遵循异步编程模型,既可以避免死锁,也能提升应用响应性。比如将上传代码改为异步版本:
using (var stream = await tempfile.OpenStreamForReadAsync()) { var request = service.Files.Create(fileMetadata, stream, "application/octet-stream"); await request.UploadAsync(); var uploadedFile = request.ResponseBody; Debug.WriteLine($"文件已上传: {uploadedFile.Name} ({uploadedFile.Id})"); }
- 你的写法能运行,是因为相关API调用在后台线程执行,未占用UI线程上下文,但这不符合UWP的异步最佳实践,在复杂场景下(比如多个并发调用、UI线程依赖操作)容易出现稳定性问题。
目前这种同步调用方式并未被官方明确禁止,但也不属于推荐的正式用法,更稳妥的选择是遵循异步编程规范使用await。
内容的提问来源于stack exchange,提问作者Ariel P
相关产品推荐
相关产品推荐

