2010-04-03 17 views
5

Ich habe die folgende Methode:C# Threading in einem Verfahren

public List<string> someMethod() 
{ 

    // populate list of strings 
    // dump them to csv file 
    //return to output 
} 

Frage ist: i Der Benutzer möchte nicht für csv-Dump warten, was eine Weile dauern könnte. Wenn ich einen Thread für csvdump verwende, wird es abgeschlossen? vor oder nach der Rückgabe der Ausgabe?

Nachdem csvdump beendet ist, möchte ich eine andere Klasse benachrichtigen, um die CSV-Datei zu verarbeiten. someMethod muss nicht warten, bis csvdump fertig ist?

+2

Wird das Programm die Datei verwenden, nachdem es erstellt wurde, oder ist es nur ein Export für andere Programme zu lesen? Benötigen Sie eine Benachrichtigung, wenn der Export abgeschlossen ist? –

+0

Ich habe die Frage bearbeitet. guter Punkt – DarthVader

+0

WinForms, WPF, ASP.NET? –

Antwort

4

This ist ein ausgezeichneter Artikel über C# -Threading, den jeder lesen sollte, der etwas über C# Threading wissen möchte.

Aber für Ihre Situation würde ich so etwas tun:

class Program { 
    static BackgroundWorker bw; 
    static void Main() { 
    bw = new BackgroundWorker(); 
    bw.WorkerSupportsCancellation = true; 
    bw.DoWork += bw_DoWork; 
    bw.RunWorkerCompleted += bw_RunWorkerCompleted; 

    bw.RunWorkerAsync(); 
    } 

    static void bw_DoWork (object sender, DoWorkEventArgs e) { 
    //Run your code here 
    } 

    static void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) { 
    //Completed 
    } 
} 

Wenn der Prozess einige Zeit in Anspruch nehmen ist wahrscheinlich, dass Sie die Background Fortschritt ist es zu berichten bekommen können.

+0

+1 für den Link. Es ist ein * ausgezeichneter * Artikel. –

2

Wenn Sie nicht möchten, dass der Benutzer auf die Ausführung des Vorgangs wartet, rufen Sie einen asynchronen Aufruf auf.

Asynchronus calls follow a pattern in .NET dass ich schlage vor, Sie verwenden.

Diese Art von Aufrufen beinhaltet (normalerweise) das Verwenden des ThreadPool, um die Aktion im Hintergrund auszuführen und dann einen bestimmten Rückruf aufzurufen, wenn die Aktion abgeschlossen ist. Sie können in diesem Callback etwas tun (das vom Thread ausgeführt wird).

Dieses Modell erfordert, dass der Benutzer weiß, dass der Prozess asynchron ist. Das ist eigentlich eine gute Sache für 99% der Fälle, weil Sie in der Lage sein müssen, den aufrufenden Code zu sagen, dass die Aufgabe noch nicht ist, Sie das Steuerelement sofort zurückgeben, aber das bedeutet nicht, dass die Arbeit abgeschlossen wurde.

2

Wenn Sie dies von einer WinForms- oder WPF-Benutzeroberfläche aus tun, können Sie den CVS-Dump mit BackgroundWorker ausführen, der die Arbeit in einem Hintergrundthread ausführen und ein Ereignis an die Benutzeroberfläche senden kann.

+0

Ja, nur wenn das OP eine Win/Wpf-GUI verwendet –

+0

Guter Punkt, die Antwort wurde aktualisiert. –