2010-04-03 28 views
5

Mam następujący sposób:C# Threading w metodzie

public List<string> someMethod() 
{ 

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

pytanie brzmi: nie chcę użytkownika, aby czekać na csv wysypisko, co może trochę potrwać. Jeśli używam wątku do csvdump, będzie on kompletny? przed lub po zwrocie produkcji?

Po zakończeniu csvdump chciałbym powiadomić inną klasę o przetworzeniu pliku csv. someMethod nie musi czekać na zakończenie csvdump?

+2

Czy program będzie używał pliku po jego utworzeniu, czy jest to tylko eksport do odczytu innych programów? Czy potrzebujesz jakiegoś powiadomienia po zakończeniu eksportu? –

+0

Edytowałem pytanie. dobry punkt – DarthVader

+0

WinForms, WPF, ASP.NET? –

Odpowiedz

4

This to doskonały artykuł na temat C# threading, że każdy, kto chce wiedzieć o C# powinien przeczytać wątek.

Ale dla danej sytuacji chciałbym zrobić coś takiego:

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 
    } 
} 

Jeśli proces może zająć trochę czasu, można uzyskać BackgroundWorker zgłosić to postęp zbyt.

+0

+1 dla linku. To jest * doskonały * artykuł. –

2

Jeśli nie chcesz, aby użytkownik czekał na zakończenie operacji, która wywołuje wywołanie asynchroniczne.

Asynchronus calls follow a pattern in .NET który proponuję użyć.

Tego rodzaju połączenia obejmują (zwykle) używanie ThreadPool do wykonywania akcji w tle, a następnie wywoływanie danego wywołania zwrotnego po zakończeniu działania. Możesz zrobić coś w tym wywołaniu zwrotnym (wykonanym przez wątek).

Ten model wymaga, aby użytkownik wiedział, że proces jest asynchronus. Jest to dobre rozwiązanie w 99% przypadków, ponieważ musisz być w stanie powiedzieć kodowi wywołującemu, że zadanie nie jest jeszcze wykonane, możesz natychmiast zwrócić kontrolę, ale to nie znaczy, że praca została zakończona.

2

Jeśli robisz to z interfejsu użytkownika WinForm lub WPF, możesz użyć pliku BackgroundWorker do wykonania zrzutu CVS, który może wykonać pracę w wątku w tle i wysłać zdarzenie do interfejsu użytkownika, gdy jest ono zakończone.

+0

Tak, tylko wtedy, gdy program operacyjny korzysta z GUI Win/Wpf –

+0

Dobra odpowiedź została zaktualizowana. –