Понимание темы / BeginInvoke?[Начинающий] - PullRequest
9 голосов
/ 22 апреля 2010

Рассмотрим код:

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

9 голосов
/ 22 апреля 2010

(1) - это не уродливый взлом, но в наши дни это не "способ" создания потоков. Пул потоков потоков через BeginInvoke/EndInvoke, BackgroundWorker и параллельную библиотеку задач в .NET 4.0.

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

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

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