15

条件付きでタスクを実行したい場合があります。次のような拡張メソッドを使用します。

public static class MyTaskExtension{
  private static Task theEmptyTask = Task.Factory.StartNew(() => {}); //This is the question

  public static Task ContinueWith(this Task task, Task continuationTask, Func<bool> condition)
  {
    if condition(){
       ... do the work
    }
    return theEmptyTask;
  }
}

私の予想では、theEmptyTask は既に完了しているので、基本的に何もしたくない場合は、null または新しい空のタスクではなく、このタスクを返すだけです。

このアプローチには何らかの不具合があるはずだと感じています。誰でもそれを見ることができますか?

4

2 に答える 2

21

一部のコンテキストでは、既に完了したタスクを返すことはまったく問題ありません。それは特に頻繁に行われるものではありませんが、行われています。

単一の静的完了タスクを使用するだけでも、まったく問題はありません。すべてが同じであるさまざまなタスクをたくさん用意する必要はありません。それらが完了したら結果が得られない場合は、それらを再利用することに問題はありません。

すでに完了したタスクを返したい場合はTask.FromResult、空のメソッドを作成したり、スケジューリングしたり、開始されるのを待ったりする必要がないため、現在行っているよりもオーバーヘッドの少ないタスクを生成するために使用できます。それからすぐに終わらせてください。戻るだけTask.FromResult(false)で、すでに完了したタスクが表示されます。

.NET 4.0 を使用している場合は、独自の FromResult を簡単に作成できます。

public static Task FromResult<T>(T result)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.SetResult(result);
    return tcs.Task;
}
于 2013-03-22T13:44:33.513 に答える
1

完了状態のタスクを返す限り (これを行うために使用します)、クライアントがいじることを可能にするTaskCompletionSourceセッターがクラスに実際には存在しないため、これに関する問題は考えられません。Taskあなたの静的な空のタスク。彼らはDispose()あなたのタスクを呼び出すことができますが、それが害を及ぼすとは思いません(つまり、タスクのプロパティを検査する機能に影響を与えるとは思いません(試していません-テストする価値のあるものです) )))。

于 2013-03-22T13:20:21.083 に答える