Рассмотрите код:
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);
}
}
(Действительно ли 1) приемлемый способ легкого запуска некоторой работы в отдельном потоке? Если бы не лучшая альтернатива очень ценилась бы.
(2) делает то же? Я предполагаю то, что я спрашиваю, то, если новая дискуссия начата, или..
Надежда можно помочь новичку к лучшему пониманию :)
/Moberg
(1) - это не уродливый хакер, но это не «лучший» способ создания потоков в наши дни. Пул потоков потоки через BeginInvoke / EndInvoke
, BackgroundWorker
и Task Parallel Library в .NET 4.0 - лучший вариант.
(2) - это хорошо, НО вам нужно где-то связать свой BeginInvoke
с EndInvoke
. Назначьте новое действие Action
переменной, а затем вызовите для него x.EndInvoke ()
вручную в основном потоке или в методе завершения (второй параметр для BeginInvoke
). См. здесь как достойную ссылку.
Изменить: вот как (2) должен выглядеть примерно так, как (1):
var thread2 = new Action<string>(this.work.DoStuff);
var result = thread2.BeginInvoke(hello, null, null);
thread2.EndInvoke(result);