2010-04-22 20 views
10

Considere el código:Understanding Thread/BeginInvoke? [Principiantes]

class Work 
{ 
    public void DoStuff(string s) 
    { 
     Console.WriteLine(s); 
     // .. whatever 
    } 
} 
class Master 
{ 
    private readonly Work work = new Work(); 

    public void Execute() 
    { 
     string hello = "hello"; 

     // (1) is this an ugly hack ? 
     var thread1 = new Thread(new ParameterizedThreadStart(o => this.work.DoStuff((string)o)));   
     thread1.Start(hello); 
     thread1.Join(); 

     // (2) is this similar to the one above? 
     new Action<string>(s => this.work.DoStuff(s)).BeginInvoke(hello, null, null); 
    } 
} 

es (1) una forma aceptable de fácil iniciar un trabajo en un hilo separado? Si no, una mejor alternativa sería muy apreciada.

Está (2) haciendo lo mismo? Creo que lo que pido es que si se inicia un nuevo hilo, o ..

espera que usted pueda ayudar a un principiante a una mejor comprensión :)

/Moberg

+2

Hay un gran artículo aquí: http://ondotnet.com/pub/a/dotnet/2003 /02/24/asyncdelegates.html que explica los matices entre subprocesos y delegados asincrónicos. –

+0

Usar algo tan costoso como un hilo y luego desperdiciarlo con Thread.Join * no * acceptable. Hay muchos recursos para ayudarlo a elegir entre el subproceso y una secuencia de subprocesos. –

Respuesta

9

(1) no es un truco feo , pero no es "la" forma de hacer hilos en estos días. Thread Pool hilos a través de BeginInvoke/EndInvoke, BackgroundWorker y Task Parallel Library en .NET 4.0 son el camino a seguir.

(2) es bueno, PERO necesita emparejar su BeginInvoke con un EndInvoke en alguna parte. Asigne el nuevo Action<string> a una variable y luego llame al x.EndInvoke() manualmente en su hilo principal o en un método de finalización (2º parámetro al BeginInvoke). Ver here como una referencia decente.

Editar: aquí es como (2) debe buscar para ser razonablemente equivalente a (1):

var thread2 = new Action<string>(this.work.DoStuff); 
    var result = thread2.BeginInvoke(hello, null, null); 
    thread2.EndInvoke(result);