【问题标题】:Thread-Safe Call from async operation in BackgroundWorkerBackgroundWorker 中异步操作的线程安全调用
【发布时间】:2016-06-08 23:01:23
【问题描述】:

我在 BackgroundWorker 中有一些代码可以帮助我防止在 Bass 连接到音频流时界面冻结:

Private Sub WorkerConnectToStream_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles WorkerConnectToStream.DoWork
    Bass.BASS_StreamFree(StreamNumber)
    StreamNumber = Bass.BASS_StreamCreateURL(StreamAddr, 0, BASSFlag.BASS_STREAM_STATUS, _downloadProc_, Me.Handle)
    If StreamNumber <> 0 Then
        Bass.BASS_ChannelPlay(StreamNumber, True)
    End If
End Sub

但我得到:InvalidOperationException 和消息,“控制控件名称是从创建它的线程以外的线程访问的。”如果我将 CheckForIllegalCrossThreadCalls 属性设置为 false 或者我从 Debug 文件夹启动我的程序,那么一切正常,但这不是最佳解决方案。

如果我使用:

invoke(sub()
    StreamNumber = Bass.BASS_StreamCreateURL(StreamAddr, 0, BASSFlag.BASS_STREAM_STATUS, _downloadProc_, Me.Handle)
end sub)

然后此消息消失,但我的表单界面冻结。 我该如何解决这个问题? 非常感谢! 对不起,我的英语不好。

【问题讨论】:

    标签: vb.net multithreading interface freeze bass.dll


    【解决方案1】:

    问题是您的DoWork 在后台线程上运行,但在主线程上调用控件。控件无法做到这一点。您需要在Dowork 中引发诸如ReportProgress 之类的事件,传递数据并在那里更新您的控件。这就是 BGW 的意义所在。它使您无需编写大量代码来管理线程即可与控件进行交互。

    如果您对某事使用了某些控件并且该控件位于表单上,请尝试在 BG 线程上实例化它并仅在内存中使用它。我记得,我做过类似的事情,它奏效了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2021-11-06
      • 2018-11-16
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多