2009-09-13 6 views
1

У меня есть приложение, в котором я запускаю отдельный поток.Запуск тем в vb.net

Dim thread As New System.Threading.Thread(AddressOf Main) 
thread.Start() 

Однако нить делает ссылку на текстовом поле с именем Output, и он генерирует эту ошибку после исполнения:

System.InvalidOperationException was unhandled 
    Message="Cross-thread operation not valid: Control 'Output' accessed from a thread other than the thread it was created on." 
    Source="System.Windows.Forms" 

(сообщение укороченной для пространства)

Как я могу сделать операции запускать другой поток, но использовать объект вывода? Я не могу вызвать подпрограмму, чтобы сделать это для меня, поскольку она генерирует ту же самую ошибку.

Метод, кстати, относится к AppendText.

У меня, вероятно, отсутствует что-то важное здесь, поэтому спасибо за помощь!

ответ

2

Вместо того, чтобы просто вызвать метод AppendText, вам необходимо заставить его выполнить правильную нить. Таким образом, если у вас есть вызов, как это:

myTextBox.AppendText("some text") 

... Вам нужно изменить его к этому:

myTextBox.BeginInvoke(New Action(Of String)(AddressOf myTextBox.AppendText), "some text") 

Вы можете использовать либо Invoke или BeginInvoke. В этом случае, поскольку AppendText не имеет никакого возвращаемого значения, BeginInvoke - хороший выбор (разница в том, что Invoke блокирует текущий поток, а поток GUI выполняет метод AppendText, тогда как BeginInvoke сделает асинхронный вызов).

1

Вы должны использовать Control.Invoke или Control.BeginInvoke для вызова вашей подпрограммы.

+0

Внутри суб? – Cyclone

+0

Можете ли вы привести пример кода? – Cyclone

+0

@Cyclone: ​​см. Этот другой пост для примеров использования InvokeRequired и Invoke: http://stackoverflow.com/questions/571706/shortest-way-to-write-a-thread-safe-access-method-to-a- окна-форм-контроль. –

1

Это исключение является очень популярным исключением при использовании потока. Некоторая операция не является потокобезопасной (например, доступ к элементу управления по потоку, отличному от его собственного потока), поэтому среда предотвращает подобные проблемы. Чтобы решить эту проблему, вы можете использовать метод Control.Invoke для вызова делегата, который находится в том же потоке, что и элемент управления, или вы можете использовать фонового работника.

Here вы можете найти образец первого подхода

и

Here вы можете найти образец фона рабочего

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