VB.NET实现Google Drive文件上传首次执行异常问题求助
关于VB.NET Google Drive上传首次调用未等待完成的问题分析与修复
这个首次调用跳过异步等待的问题确实挺棘手的——我之前也遇到过类似的异步初始化导致的偶发异常,咱们一步步拆解原因和解决方案:
核心原因推测
从你的代码和现象来看,问题大概率出在首次调用时的服务实例状态或者异步上下文初始化上:
- DriveService初始化干扰异步流程:你在函数内判断
service3.ApplicationName并调用CreateService(),如果service3和传入的service不是同一个实例,首次调用时服务可能刚完成创建,底层HTTP客户端还没完成初始化,导致UploadAsync()无法正确绑定异步等待上下文,直接“跳走”。 - 首次调用的异步上下文丢失:桌面应用的同步上下文(比如WinForms/WPF)在首次处理异步操作时,可能存在初始化延迟,导致
Await没有正确捕获上下文,提前执行后续代码。
具体修复方案
方案1:提前初始化并复用DriveService实例
把服务初始化逻辑移到函数外部,确保调用UploadFile3前,服务已经完全准备好,避免首次调用时的初始化干扰异步流程:
' 全局/类级别的服务实例,确保只初始化一次 Private Shared _driveService As DriveService = Nothing ' 单独的初始化方法,在程序启动时调用(比如Form_Load) Private Sub InitializeDriveService() If _driveService Is Nothing Then ' 这里执行你的CreateService逻辑,将结果赋值给_driveService _driveService = CreateService() _driveService.ApplicationName = "netGDriveApi" End If End Sub Public Async Function UploadFile3(FilePath As String) As Tasks.Task(Of Data.File) ' 确保服务已初始化 If _driveService Is Nothing Then InitializeDriveService() End If If IO.File.Exists(FilePath) Then Dim body As New Data.File() body.Name = IO.Path.GetFileName(FilePath) body.Description = "BackUP file" body.MimeType = "application/octet-stream" ' 使用Using自动释放MemoryStream,避免资源泄漏 Using stream As New IO.MemoryStream(IO.File.ReadAllBytes(FilePath)) Try Dim request As FilesResource.CreateMediaUpload = _driveService.Files.Create(body, stream, body.MimeType) ' 增加进度监听,方便排查首次调用的执行状态 request.ProgressChanged += Sub(sender, args) Debug.WriteLine($"Upload status: {args.Status} | Bytes sent: {args.BytesSent}") End Sub ' 显式指定ConfigureAwait(True),确保回到原同步上下文 Await request.UploadAsync().ConfigureAwait(True) Dim responsefile As Data.File = request.ResponseBody If responsefile Is Nothing Then MessageBox.Show("Upload failed, please try again") Else MessageBox.Show($"Upload succeeded! File ID: {responsefile.Id}") End If Return responsefile Catch e As Exception MessageBox.Show($"An error occurred: {e.Message}") Return Nothing End Try End Using Else MessageBox.Show($"FILE DOES NOT EXISTS: {FilePath}") Return Nothing End If End Function
方案2:排查CreateService()的异步初始化问题
检查你的CreateService()方法,如果里面包含异步的认证流程(比如获取OAuth令牌),确保所有异步操作都已Await完成后再返回服务实例——如果服务实例在认证未完成时就被返回,首次调用UploadAsync()就会出现异常行为。
额外排查建议
- 在首次调用时添加Debug日志,确认
UploadAsync()的执行状态:
通过日志可以明确是Debug.WriteLine("Starting upload task...") Await request.UploadAsync() Debug.WriteLine($"Upload task completed. ResponseBody exists: {request.ResponseBody IsNot Nothing}")UploadAsync()没等待完成,还是Google Drive API本身返回了空的ResponseBody。 - 测试时确保首次调用前没有其他异步操作干扰同步上下文,比如避免在Form_Load等初始化事件中同时执行多个异步任务。
内容的提问来源于stack exchange,提问作者bonny
相关产品推荐
相关产品推荐

