Taskを使って非同期処理 5:処理の継続
今回説明するのは非同期処理が終了した後に別の処理を続けて行う方法です。
Taskの処理が終了した後に続けて処理を行う際はContinueWithメソッドを使います。
以下のサンプルコードでは最初のTaskで"処理A"をContinueWithメソッドで処理Aの結果を受け取って"処理B"を行います。
---- C# ------------------------------------------------------------------
using System.Threading;
using System.Threading.Tasks;
var task = Task<string>.Factory.StartNew(() =>
{
Thread.Sleep(500); // 重たい処理のつもり
return "処理A"; // 処理結果
});
// taskの処理が終わったら次の処理を行う
task.ContinueWith(task1 =>
{
Console.WriteLine(" {0} -> 処理B", task1.Result);
});
------------------------------------------------------------------------
ContinueWithでTaskの処理が終了した後に行う処理を記述します。
ContinueWithの引数のデリゲートは前処理を行ったTaskを引数として受け取ります。
(上記のサンプルの"task1"は"task"と同じものです。)
task1.Resultプロパティで前処理の結果を受け取ることができます。
このコードを実行すると、
処理A -> 処理B
と表示されます。
以下の様に同じTaskに対して複数のContinueWithを指定することもできます。
---- C# ------------------------------------------------------------------
// taskの生成は省略
task.ContinueWith(task1 =>
{
Console.WriteLine(" {0} -> 処理B", task1.Result);
});
task.ContinueWith(task1 =>
{
Console.WriteLine(" {0} -> 処理C", task1.Result);
});
--------------------------------------------------------------------------
この場合はtaskの処理(処理A)が終わったら処理Bと処理Cが同時に実行されます。
(以下のようなイメージになります)
結果は、
処理A -> 処理C
処理A -> 処理B
の様に表示されます。
ContinueWithの後にさらにContinueWithを続けることもできます。
---- C# -----------------------------------------------------------
// taskの生成は省略
task.ContinueWith<string>
(
task1 =>
{
return task1.Result + " -> 処理B";
}
)
.ContinueWith
(
task2 => Console.WriteLine(" {0} -> 処理C", task2.Result)
);
-------------------------------------------------------------------
ContinueWith<T>メソッドはTask<T>と同じ様に処理の結果を返します。
(task2.ResultにはContinueWith<T>の処理結果が入っています。)
この場合は以下のような流れで処理が行われます。
これを実行すると、
処理A -> 処理B -> 処理C
と表示されます。
TaskとContinueWithを使うとこんな感じで簡単に継続処理を行うことができます。
次回は特定の条件でのみ継続処理を行う方法を紹介します。
コメント