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