5

私の問題は、タスクにTask.WhenAll()呼び出し(他のタスクの実行)がある場合、WhenAll()の行によって、予想とは異なり、消費するコードの実行が継続されることです。したがって、次のコードは、引数内のすべてのタスクが終了した後ではなく、Task.WhenAll()がヒットした直後に「終了」を出力します。

    // Just a simple async method
    public Task DoWorkAsync()
    {
        return Task.Factory.StartNew(
            () =>
            {
                // Working
            });
    }

    // This one used the previous one with Task.WhenAll()
    public Task DoLoadsOfWorkAsync()
    {
        return Task.Factory.StartNew(
            async () =>
            {
                // Working
                // This line makes the task return immediately
                await Task.WhenAll(DoWorkAsync(), DoWorkAsync());
                // Working
            });
    }

    // Consuming code
    await DoLoadsOfWorkAsync();
    Console.WriteLine("finished");

DoLoadsOfWorkAsync()の最後の行が実行されたときに、WriteLine()が呼び出されることを期待しています。

私は何が間違っているのですか?前もって感謝します。

4

1 に答える 1

21

Task.WhenAllすぐに新しいものを返しますTask。ブロックしません。返されたタスクは、渡されたすべてのタスクが完了すると完了WhenAllします。

これはと同等の非同期Task.WaitAllであり、これはブロックする場合に使用するメソッドです。

However you have another problem. Using Task.Factory.StartNew and passing an async delegate seems to lead to a type of Task<Task> where the outer task completes when the inner task starts to execute (rather than when it has completed).

Using the newer Task.Run avoids this.

于 2012-11-17T15:41:50.697 に答える