2010-04-03 16 views
5

Ho il seguente metodo:C# Threading in un metodo

public List<string> someMethod() 
{ 

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

domanda è: io non voglio all'utente di attendere discarica csv, che potrebbe richiedere del tempo. Se uso una discussione per csvdump, sarà completata? prima o dopo il ritorno della produzione?

Al termine di csvdump, desidero informare un'altra classe per elaborare il file csv. someMethod non ha bisogno di aspettare che csvdump finisca?

+2

Il programma sta per utilizzare il file dopo che è stato creato o è solo un'esportazione per altri programmi da leggere? Hai bisogno di un qualche tipo di notifica quando ha finito di esportare? –

+0

Ho modificato la domanda. buon punto – DarthVader

+0

WinForms, WPF, ASP.NET? –

risposta

4

This è un eccellente articolo sul threading C# che chiunque voglia sapere su C# Threading dovrebbe leggere.

Ma per la vostra situazione vorrei fare qualcosa di simile:

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

Se il processo rischia di prendere un po 'di tempo è possibile ottenere il BackgroundWorker per segnalare che è il progresso troppo.

+0

+1 per il collegamento. È un * eccellente * articolo. –

2

Se non si desidera che l'utente attenda il completamento dell'operazione, viene chiamata una chiamata asincrona.

Asynchronus calls follow a pattern in .NET che suggerisco di utilizzare.

Questo tipo di chiamate comporta (in genere) l'utilizzo del ThreadPool per eseguire l'azione in background e quindi richiamare un callback specificato quando l'azione è completa. Puoi fare qualcosa in questo callback (che viene eseguito dal thread).

Questo modello richiede all'utente di sapere che il processo è asincrono. Questo è in realtà una buona cosa per il 99% dei casi perché è necessario essere in grado di dire al codice chiamante che l'attività non è ancora attiva, si restituisce il controllo immediatamente, ma ciò non significa che il lavoro è stato completato.

2

Se si esegue questa operazione da un'interfaccia utente WinForms o WPF, è possibile utilizzare uno BackgroundWorker per eseguire il dump CVS, che può eseguire il lavoro in un thread in background e inviare un evento all'interfaccia utente al termine.

+0

Sì, solo quando l'OP utilizza una GUI Win/Wpf –

+0

Buon punto, la risposta è stata aggiornata. –