2010-04-22 17 views
10

Rozważmy kod:Zrozumienie wątku/BeginInvoke? [Początkujący]

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

Czy (1) dopuszczalny sposób łatwy zaczynając jakąś pracę w osobnym wątku? Gdyby nie lepsza alternatywa byłaby doceniona.

Czy (2) robi to samo? Chyba co pytam jest, jeśli nowy wątek jest uruchomiony, lub ..

Spodziewać się można pomóc początkującym do lepszego zrozumienia :)

/Moberg

+2

Istnieje wielka artykuł tutaj: http://ondotnet.com/pub/a/dotnet/2003 /02/24/asyncdelegates.html, który wyjaśnia niuanse między wątkami i asynchronicznymi delegatami. –

+0

Używanie czegoś tak drogiego jak wątek, a następnie marnowanie go za pomocą Thread.Join jest * nie * do zaakceptowania. Istnieje wiele zasobów, które pomogą Ci wybrać wątek i wątek wątku. –

Odpowiedz

9

(1) nie jest brzydki Hack , ale to nie jest "ten" sposób robienia nici w dzisiejszych czasach. Thread Pool wątki poprzez BeginInvoke/EndInvoke, BackgroundWorker i Task Parallel Library w .NET 4.0 są drogą do zrobienia.

(2) jest dobry, ale musisz sparować ze sobą BeginInvoke z EndInvoke. Przypisz nową Action<string> do zmiennej, a następnie ręcznie wywołaj ją w głównym wątku lub w metodzie uzupełniania (drugi parametr do BeginInvoke). Zobacz here jako przyzwoity odnośnik.

Edit: oto jak (2) powinny być racjonalnie patrzeć równoważne (1):

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