2010-04-22 2 views
10

Рассмотрим код:Понимание темы/BeginInvoke? [Начинающий]

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

Is (1) приемлемым способом легко начинают какую-то работу в отдельном потоке? Если бы не лучшая альтернатива была бы высоко оценена.

Есть (2) делать то же самое? Я предполагаю, что я спрашиваю, если запускается новый поток, или ..

Надеется, что вы можете помочь начинающий к лучшему пониманию :)

/Моберг

+2

Существует большая статья здесь: http://ondotnet.com/pub/a/dotnet/2003 /02/24/asyncdelegates.html, который объясняет нюансы между потоками и асинхронными делегатами. –

+0

Использование чего-то столь же дорогостоящего, как нить, а затем тратить его на Thread.Join * не * приемлемо. Существует много ресурсов, которые помогут вам выбрать между Thread и threadpool thread. –

ответ

9

(1) не является уродливым хак , но это не «способ» создания потоков в наши дни. Thread Pool потоки через BeginInvoke/EndInvoke, BackgroundWorker и Task Parallel Library в .NET 4.0 - это путь.

(2) хорошо, НО вам нужно соединить BeginInvoke с EndInvoke. Назначьте новую Action<string> переменной, а затем вызовите x.EndInvoke() вручную в ней в основной теме или в методе завершения (второй параметр - BeginInvoke). См. here как достойную ссылку.

Edit: вот как (2) должен выглядеть, чтобы быть разумно эквивалентно (1):

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