Task.ContinueWith で非同期コールバックを使用する 質問する

Task.ContinueWith で非同期コールバックを使用する 質問する

私は C# の async/await/continuewith を少し試してみようと思っています。私の目標は、2 つのタスクを並行して実行することです。ただし、タスクは一連のアクションを順番に実行します。そのために、List<Task>並行して実行されている 2 つ (またはそれ以上) のタスクを表す を用意し、ContinueWith各 で使用することを計画しました。問題は、 がすでに返されているTask間は、continue with のコールバックが実行されないように見えることです。await taskList

要約すると、何が起こると予想しているかを示すサンプルがここにあります。

class Program
{
    static public async Task Test()
    {
        System.Console.WriteLine("Enter Test");
        await Task.Delay(100);
        System.Console.WriteLine("Leave Test");
    }

    static void Main(string[] args)
    {
        Test().ContinueWith(
        async (task) =>
        {
            System.Console.WriteLine("Enter callback");
            await Task.Delay(1000);
            System.Console.WriteLine("Leave callback");
        },
        TaskContinuationOptions.AttachedToParent).Wait();
        Console.WriteLine("Done with test");
    }
}

予想される出力は次のようになります

Enter Test
Leave Test
Enter callback
Leave callback
Done with test

しかし、出力は

Enter Test
Leave Test
Enter callback
Done with test

呼び出されたタスクが、ContinueWith指定された関数が完了するまで待機してから完了と見なされるようにする方法はありますか? つまり、.Wait は、元のタスクと ContinueWith によって返されたタスクの両方が完了するまで待機します。

ベストアンサー1

メソッドを使用して複数のタスクを連鎖する場合ContinueWith、戻り値の型は になりますTask<T>が、Tは に渡されるデリゲート/メソッドの戻り値の型になりますContinueWith

非同期デリゲートの戻り値の型は であるため、 が返され、最初の の後に実行される非同期デリゲートが を返すのを待機することになりTaskます。Task<Task>Taskawait

この動作を修正するには、Taskに埋め込まれた返された を使用する必要がありますTask<Task>Unwrapそれを抽出するための拡張メソッド。

おすすめ記事