5

スレッドを使用して UI のブロックを解除したい。

このコードの違いを教えてください:

private async void button1_Click(object sender, EventArgs e)
{
    int result = await Calculate(1, 2);

    label1.Text = result.ToString();
}

private async Task<int> Calculate(int number1, int number2)
{
    return await Task.Run(() =>
    {
        Thread.Sleep(5000);
        return number1 + number2;
    });
}

そして、このコード:

private async void button1_Click(object sender, EventArgs e)
{
    int result = await Calculate(1, 2);

    label1.Text = result.ToString();
}

private async Task<int> Calculate(int number1, int number2)
{
    await Task.Delay(5000);
    return number1 + number2;
}
4

1 に答える 1

2

主な違いはTask.Run、新しいスレッドを作成することです (この MSDN ドキュメントのスレッド セクションを参照してください)。
したがって、新しいスレッドは最初のケースで 5 秒間ブロックを作成し、結果を返します (一方、メイン スレッドは使用可能であるため、await は から呼び出し元に制御を返しますTask.Run(...)) 。

2 番目のケースでも、await の後、制御が呼び出し元に渡され、Task.Delay がメイン スレッドで実行されます。新しいスレッドは作成されません。

質問で述べたように、マルチスレッドを使用する場合は、 andとTask.Run()一緒に使用すると、多くの可能性が得られます。asyncawait

asyncおよび制御フローの詳細についてawaitは、上記のドキュメントを参照してください。非常に役立つ、詳細な MSDN の読み物です。

于 2013-10-01T08:04:10.830 に答える