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

VB.NET实现Google Drive文件上传首次执行异常问题求助

关于VB.NET Google Drive上传首次调用未等待完成的问题分析与修复

这个首次调用跳过异步等待的问题确实挺棘手的——我之前也遇到过类似的异步初始化导致的偶发异常,咱们一步步拆解原因和解决方案:

核心原因推测

从你的代码和现象来看,问题大概率出在首次调用时的服务实例状态或者异步上下文初始化上:

  1. DriveService初始化干扰异步流程:你在函数内判断service3.ApplicationName并调用CreateService(),如果service3和传入的service不是同一个实例,首次调用时服务可能刚完成创建,底层HTTP客户端还没完成初始化,导致UploadAsync()无法正确绑定异步等待上下文,直接“跳走”。
  2. 首次调用的异步上下文丢失:桌面应用的同步上下文(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:27:49