Aufruf von ShowDialog in der BackgroundWorker-Klasse
Ich habe eine WinForms-Anwendung, in der mein hintergrund ist ein Arbeiter macht eine sync-Aufgabe, das hinzufügen von neuen Dateien, alte entfernen etc.
In meinem hintergrund-worker-code, mit dem ich zeigen möchte, ein benutzerdefiniertes Formular zu Benutzer und erzählen Sie ihm, was gelöscht wird und was Hinzugefügt wird, wenn er fortfährt, mit JA/NEIN-Tasten zu bekommen sein feedback.
Ich Frage mich, ob es ok ist, etwas zu tun, wie dieser in den hintergrund Arbeitnehmers, die doWork-Methode?
Wenn nicht, wie sollte ich es tun?
Bitte beraten..
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
MyForm f = new MyForm();
f.FilesToAddDelete(..);
DialogResult result = f.ShowDialog();
if(No...)
return;
else
//keep working...
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie versuchen dieses Sie werden selbst sehen, dass es nicht funktionieren wird, weil die
BackgroundWorker
thread nicht STA (es kommt aus dem verwalteten thread-pool).Die Essenz der Sache ist, dass man nicht zeigen-Benutzeroberfläche von einem worker thread1, so muss man es umgehen. Sie sollten übergeben Sie einen Verweis auf ein element der Benutzeroberfläche Ihrer Anwendung (die wichtigste form wäre eine gute Wahl), und verwenden Sie dann
Aufzurufen
zu Marshallen einer Anforderung für Benutzer-Interaktion, um Ihre UI-thread. Ein simpler Beispiel:Und der hintergrund sind Arbeiter, dies zu tun wäre:
1 Technisch, Sie kann nicht anzeigen, user interface aus einem thread, der nicht STA. Wenn Sie einen worker-thread selbst können Sie wählen, um it-Mitarbeiter sowieso, aber wenn es darum geht aus dem thread-pool gibt es keine solche Möglichkeit.
static
oder einige andere Abfall Grund so. Es ist, weil es speziell stellt eine eigene Nachrichtensystem.Ich in der Regel erstellen Sie eine Methode für das ausführen einer Delegierten auf dem UI-thread:
Mit dabei, können Sie den code ändern zu:
IMO beantwortet, die besagt, dass Sie sollten starten Sie einen thread, um diese zu bewältigen, sind fehlgeleitet. Was Sie brauchen, ist zu springen und die Fenster wieder an die main-dispatcher-thread.
In WPF
dann, wenn ein Ereignis Auftritt in einem anderen thread (thread-pool-thread in diesem Fall):
WinForms gleichwertig
Nicht UIDispatcher nichts, dann kannst du das tun haben:
Trocknen Sie es für WPF:
Mann, so viel code...
und in der Ansicht Modell:
Hoffe, es hilft.
Sollten Sie den dialog aufzurufen, bevor Sie führen Sie die backgroundworker-Klasse. Und in der progresschanged-Ereignis aktualisiert, können Sie das Dialogfeld.