5

これが私が見続けるコードです-

public Task PossiblyAsyncOperation(bool condition)
    {
        //this condition means i need to do something async, for sure
        if (condition)
             return AsyncOp();

        //since it didnt hit the above condition
        //we're not doing the async op now
        //.....this just feels wrong
        return Task.Factory.StartNew(() => { ; });
    }

実際に非同期操作を実行する予定がない場合に戻るためのより良い方法はありますか?または、新しく開始したタスクを返す必要がありますか?そのためのパフォーマンスヒットはありますか?

4

3 に答える 3

8

Task.FromResult<T> .Net 4.5を使用している場合に使用できます

return Task.FromResult<object>(null);

それ以外の場合は、独自の実装を作成できます

public static Task CreateEmptyTask()
{
    var tcs = new TaskCompletionSource<object>();
    tsc.SetResult(null);
    return tcs.Task;
}

コメントが指摘しているように、このタスクをキャッシュできる場合がありますが、破棄されないようにする必要があることに注意してください。たとえば、次の場合は例外がスローされます。

public static readonly Task EmptyTask = Task.FromResult<object>(null);

Task t = EmptyTask;
t.Dispose();
((IAsyncResult)t).AsyncWaitHandle.WaitOne();
于 2012-12-17T22:47:21.570 に答える
1

いつでもTaskCompletionSourceを作成して、Taskプロパティを返すことができます。これは、基本的に非同期呼び出しを完全にスキップする方法です。

于 2012-12-17T22:36:51.507 に答える
0

あなたが何もしていないTaskのにクラス、つまり参照である場合、単純にnull..を返さないでください。

public Task PossiblyAsyncOperation(bool condition)
{
     //this condition means i need to do something async, for sure
     if (condition)
          return AsyncOp();

     //since it didnt hit the above condition
     //we're not doing the async op now
     //.....this just feels wrong
     return null; //RETURN NULL
}
于 2012-12-17T22:38:13.680 に答える