2010-04-03 16 views
5

tengo el siguiente método:C# que rosca en un método

public List<string> someMethod() 
{ 

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

La pregunta es: yo no quiero que el usuario espere volcado csv, lo que podría tomar un tiempo. Si uso un hilo para csvdump, ¿se completará? antes o después de la devolución de la producción?

Después de que termine csvdump, me gustaría notificar a otra clase para procesar el archivo csv. ¿Algún método no necesita esperar a que csvdump termine?

+2

¿El programa va a usar el archivo después de haber sido creado, o es solo una exportación para que otros programas lo lean? ¿Necesita algún tipo de notificación cuando ha terminado de exportar? –

+0

Edité la pregunta. buen punto – DarthVader

+0

WinForms, WPF, ASP.NET? –

Respuesta

4

This es un excelente artículo sobre enhebrado de C# que cualquiera que desee saber sobre C# Threading debe leer.

Pero para su situación que haría algo como esto:

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

Si el proceso es probable que tome algún tiempo se puede obtener el BackgroundWorker para informar el progreso es demasiado.

+0

+1 para el enlace. Es un * excelente * artículo. –

2

Si no desea que el usuario espere que la operación se complete, llame a una llamada asincrónica.

Asynchronus calls follow a pattern in .NET que sugiero que uses.

Este tipo de llamadas implican (normalmente) utilizar ThreadPool para realizar la acción en segundo plano y luego invocar una devolución de llamada dada cuando se completa la acción. Puede hacer algo en esta devolución de llamada (que se ejecuta mediante el hilo).

Este modelo requiere que el usuario sepa que el proceso es asincrónico. De hecho, eso es bueno para el 99% de los casos porque necesita poder decirle al código de llamada que todavía no se ha completado la tarea, devuelve el control de inmediato, pero eso no significa que el trabajo se haya completado.

2

Si usted está haciendo esto desde una interfaz de usuario de Windows Forms o WPF, se puede utilizar un BackgroundWorker hacer el volcado de CVS, lo que puede hacer el trabajo en un subproceso en segundo plano, y enviar un evento para la interfaz de usuario cuando se ha completado.

+0

Sí, solo cuando el OP está utilizando una GUI de Win/Wpf –

+0

Buen punto, la respuesta se ha actualizado. –