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