0

我在 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)

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

4

1 回答 1

0

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

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

于 2016-02-25T22:44:48.533 回答