2

Ich habe über die Funktionen in der TPL-Bibliothek gelernt. Ich stieß auf eine article von Stephen Cleary, die den BackgroundWorker und Task.Run vergleicht. Ich bin ziemlich vertraut mit TPL und habe beschlossen, in meiner WinForm-Anwendung etwas BackgroundWorker-Code in Task.Run umzuwandeln, aber ich war nicht in der Lage, das Task.Run-Äquivalent für eine bestimmte Situation zu berechnen. Im Wesentlichen zeige ich ein modales Formular an, während der lange laufende Vorgang in dem BackgroundWorker ausgeführt wird, mit dem Zweck, den Benutzer daran zu hindern, irgendetwas zu tun, während auch sichergestellt wird, dass die App nicht hängt. Nach Abschluss wird das modale Formular programmgesteuert geschlossen. Ich habe ein kurzes Beispiel mit BgWorker gemacht. Hier ist die Hauptform:Konvertieren von BackgroundWorker in Task.Run mit einer Modal-Anzeige

public partial class Form1 : Form 
{ 
     FrmMessageBox frm_ = new FrmMessageBox(); 
     BackgroundWorker worker_ = new BackgroundWorker(); 

     public Form1() 
     { 
      InitializeComponent(); 
      worker_.DoWork += (_, __) => 
      { 
       Thread.Sleep(10000); 
      }; 

      worker_.RunWorkerCompleted += (_, __) => 
      { 
        frm_.Close(); 
      }; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      worker_.RunWorkerAsync(); 
      ShowMessageBox(); 
     } 

     private void ShowMessageBox() 
     { 
      frm_.Show("We're delaying 10 secs!", "Delay"); 
     } 

     private void CloseMessageBox() 
     { 
      frm_.Close(); 
     } 
    } 

Hier ist die FrmMessageBox Klasse:

public partial class FrmMessageBox : Form 
    { 
     public FrmMessageBox() 
     { 
      InitializeComponent(); 

     } 

     public DialogResult Show(string message, string title) 
     { 
      Text = title; 
      label1.Text = message; 
      return ShowDialog(); 
     } 
    } 

Wenn ich auf die Schaltfläche klicken Sie auf das Hauptformular, das BgWorker startet und die modale Formular angezeigt. Sobald der BgWorker fertig ist, wird das Formular im abgeschlossenen Ereignis geschlossen. Gibt es eine Möglichkeit, das gleiche Verhalten mit Task.Run zu bekommen?

Antwort

2

Versuchen Sie diesen Code

private void button1_Click(object sender, EventArgs e) 
{ 
    Task.Run(() => 
    { 
     Thread.Sleep(2000); 
     Invoke(new Action((CloseMessageBox)); 
    }); 

    ShowMessageBox(); 
} 
+0

Dank! Es gibt einen Syntaxfehler in der Invoke-Zeile (fehlt ")"), ansonsten hat das funktioniert. – Seapoe

+0

Wäre interessant zu wissen, ob es eine Möglichkeit gibt, dies zu tun, ohne die CloseMessageBox zum GUI-Thread zu marshallen ... – Seapoe

Verwandte Themen