2016-02-25 6 views
0

У меня есть некоторый код в BackgroundWorker, который помогает мне предотвратить замерзание интерфейс, а бас подключения к аудиопотока:поточно-вызов из асинхронной операции в BackgroundWorker

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) 

, то это сообщение является исчезает, но интерфейс моей форме замерзает. Как я могу решить эту проблему? Большое спасибо! Я прошу прощения за мой плохой английский.

ответ

0

Проблема в том, что ваш DoWork работает на фоновом потоке, но вызывает контроль над основной нитью. Элементы управления не могут этого сделать. Вам необходимо поднять событие, например ReportProgress, в пределах вашего Dowork, передать данные и обновить ваш контроль. Это то, о чем говорит BGW. Он позволяет вам взаимодействовать с элементами управления без написания тонны кода для управления потоками.

Если вы используете какой-то элемент управления для чего-то, и этот элемент управления находится в форме, попробуйте создать экземпляр в потоке BG и использовать его только в памяти. Я помню, я сделал что-то подобное, и это сработало.

Смежные вопросы