4

私はこのような方法を持っています:

private async Task DoSomething()
{
    // long running work here.
}

このようにメソッドを呼び出すと、UI がブロックされます。

Task t = DoSomething();

ブロックしないようにするには、次のいずれかを実行する必要があります。

Task t = new Task(() => DoSomething());
t.Start();

// Or

Task t = Task.Factory.StartNew(() => DoSomething());

では、フレームワーク 4 の場合と同じようにタスクを使用Task.Wait()し、代わりに使用できる場合、async / await のポイントは何awaitですか?

編集:あなたの答えはすべて理解していますが、最後の段落に実際に対処しているものはありません。async / await がプログラムの可読性やフローを改善するタスクベースのマルチスレッドの例を誰か教えてもらえますか?

4

3 に答える 3

4

をどのように使用していawaitますか? これは UI をブロックしません。

    private async Task DoSomething()
    {
        await Task.Delay(5000);
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await DoSomething();
        MessageBox.Show("Finished");
    }

詳細なコールバックを記述する必要がないことに注意してください。asyncそれが/のポイントですawait

于 2012-09-26T00:42:09.357 に答える
2

asyncメソッドは同期的に実行を開始します。async非同期操作を構成するのに役立ちますが、別のスレッドで実行するように指示しない限り、魔法のようにコードを実行するわけではありません。

Task.RunCPU バウンドの作業をスレッドプール スレッドにスケジュールするために使用できます。

詳細については、私のasync/awaitイントロ投稿またはasyncFAQを参照してください。

于 2012-09-26T02:44:30.120 に答える
0

実際のコードがないと、何が起こっているのかを知るのは難しいですが、「await Task.Yield();」でDoSomethingを開始できます。最初の待機の前に実行されているものがUIの問題の原因である場合に備えて、すぐに戻すように強制します。

于 2012-09-26T01:59:17.033 に答える