Ошибка, возникающая при попытке изменить / обновить элементы управления пользовательского интерфейса с помощью BackgroundWorker
, не имеет ничего общего с совместным использованием ресурсов в потоке.В нем просто говорится, что вы не можете изменить элемент управления, созданный в другом потоке.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
textBox1.Text = "Test";
}
Results in:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.
Это используется для того, чтобы несколько потоков не обращались к одним и тем же элементам управления и не меняли их одновременно.BackgroundWorkers
являются асинхронными и могут вызвать много проблем, если элементы управления были обновлены, в то время как основной поток также обновляет их.
Я не знаю, как они достигли этого, однако, вероятно, в интересахони предотвратили это.
MSDN предоставил еще одну строку документации для скопированного вами сегмента, в котором говорится, что события BackgroundWorker не маршалируются через границы AppDomain. Не используйте компонент BackgroundWorker для выполнения многопоточных операций более чем в одномAppDomain. "
РЕДАКТИРОВАНИЕ СООТВЕТСТВУЕТ ПРЕОБРАЗОВАНИЮ В КОММЕНТАРИИ:
private void Form1_Load(object sender, EventArgs e)
{
TextBox.CheckForIllegalCrossThreadCalls = false;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
textBox1.Text = "Test";
}
При добавлении CheckForIllegalCrossThreadCalls = false этот код выполняется без ошибок.
В сводкев логическом свойстве указывается, что он указывает, нужно ли «перехватывать вызовы в неправильном потоке».