Безопасен ли BackgroundWorker в c # Thread?
Причина, по которой я спрашиваю это, заключается в том, что я получаю
Элементы управления, созданные в одном потоке, не могут
быть родителем к контролю на
другая нить
исключение с ним. Это мой DoWork
код события:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var openFile = document.Open(MyFileName);
e.Result = openFile;
}
где document
- это элемент управления пользовательского интерфейса, который инициализируется при создании родительской формы. При методе Open
будут заполнены различные свойства в document
.
Я пытался изменить код для вызова, но та же проблема сохраняется. то есть,
document.GetType().GetMethod("Open)".Invoke(document, new object[]{MyFileName})
выдаст ту же ошибку, что и выше.
Есть идеи, как управлять элементом управления document
? Другими словами, как заставить работать приведенный выше код?
Редактировать: Было предложено использовать Control.Invoke
, но он все равно не работал (оба потока зависли). Это код, который я пробовал:
private delegate bool OpenFile(string filePath);
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
OpenFile oF = new OpenFile(document.Open);
var openFile = Invoke(oF, MyFileName); // it doesn't really matter whether I use BeginInvoke or Invoke, or other Control.Invoke, the end result is the same. Both the main thread hosting the document and the thread that launches the UI hanged.
e.Result = openFile;
}