たとえば、以下のシグネチャを持つメソッドを書いているとしましょう (C#4 なので async キーワードはありません):
public Task Refresh();
1 つのメソッド ( も返すTask
) を呼び出して通信作業を実行し、タスクの継続を実行して、取得したデータに基づいて内部状態を更新します。例えば:
public Task Refresh()
{
Task<MyData> commsTask = datasource.LoadData();
Task handleDataTask = commsTask.ContinueWith( HandleNewData );
return ?;
}
完了状態を返すhandleDataTask
と、「更新」操作の結果が正しく追跡されますが、開始状態が正しく報告されません。
両方を新しいものにラップTask.Factory.StartNew
して子タスクとして作成することはできますが、一部のタスクの継続をリンクするためだけに新しいスレッドをスプールするのは無駄に思えます。
確かにTPLでこれを行う効率的な方法はありますか?