Подтвердить что ты не робот

Понимание темы /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

4b9b3361

Ответ 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);