Czy BackgroundWorker w C# Temat jest bezpieczny?Jak upewnić się, że interfejs użytkownika reaguje na używanie BackgroundWorker
Pytam bo to dostać
sterujących utworzonych na jednym wątku nie mogą być wychowywane do kontroli na innym wątku
wyjątek z nim. To jest mój kod DoWork
wydarzenie:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var openFile = document.Open(MyFileName);
e.Result = openFile;
}
gdzie document
jest kontrola UI, który jest zainicjowany, gdy forma dominująca jest tworzony. Podczas Open
zostaną wypełnione różne właściwości w document
.
Próbowałem zmienić kod, aby wywołać, ale ten sam problem występuje nadal. tj.
document.GetType().GetMethod("Open)".Invoke(document, new object[]{MyFileName})
spowoduje ten sam błąd, co powyżej.
Każdy pomysł, jak manipulować kontrolką document
? Innymi słowy, jak sprawić, aby powyższy kod zadziałał?
Edycja: Zasugerowano, że używam Control.Invoke
, ale nadal nie działa (oba wątki powieszono). Jest to kod próbowałem:
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;
}
@Mehdrad, potrzebuję pracującego w tle, aby utrzymać responsywność interfejsu, co * jest * dlaczego ma sens. – Graviton
@Ngu Soon Hui: Oczywiście, jeśli masz długotrwałe zadanie, które nie jest tylko operacjami interfejsu użytkownika, użyjesz tego. Jeśli * all * robisz w metodzie 'DoWork' jest manipulowanie obiektami UI, nie powinieneś używać' BackgroundWorker' i powodem jest to, że ostatecznie będziesz musiał wykonać wszystkie operacje interfejsu użytkownika w wątku UI. –
Może mieć sens i może być bardziej subtelny. Wątek może po prostu powiadomić "wątek UI", że "coś nowego się wydarzyło", a następnie jest to zależne od tego, który program obsługi powiadomień musi zaktualizować interfejs użytkownika w razie potrzeby. –