9

コードを考えてみましょう:

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)同じことをしていますか?私が尋ねるのは、新しいスレッドが開始されたかどうかだと思います。

あなたが初心者がよりよく理解するのを助けることができることを願っています:)

/モーバーグ

4

1 に答える 1

9

(1)は醜いハックではありませんが、最近のスレッドの「方法」ではありません。 を介したスレッド プールBeginInvoke/EndInvokeスレッド、BackgroundWorkerおよび.NET 4.0のTask Parallel Libraryが最適です。

BeginInvoke(2) は良いですが、EndInvokeどこかであなたをペアにする必要があります. new を変数に割り当ててから、メイン スレッドまたは完了メソッド ( の 2 番目のパラメーター) でそれを手動で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);
于 2010-04-22T14:59:24.623 に答える