3

この質問(およびその回答)に従って、私は TaskCompletionSource を使用Task.WhenAllし、タスクが最初に True を返すまで待ち​​たいと思います。だから私はこれを書いた:

TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
Task<bool> t0 = Task.Factory.StartNew<bool>(() => Find(paramA, paramB);
Task<bool> t1 = Task.Factory.StartNew<bool>(() => Find(paramC, paramD);
Task<bool> t2 = Task.Factory.StartNew<bool>(() => Find(paramE, paramF);
Task<bool> t3 = Task.Factory.StartNew<bool>(() => Find(paramG, paramH);

t0.ContinueWith(_ =>
{
    if (t0.Result)
        tcs.TrySetResult(t0.Result);
});

t1.ContinueWith(_ =>
{
    if (t1.Result)
        tcs.TrySetResult(t1.Result);
});

t2.ContinueWith(_ =>
{
    if (t2.Result)
        tcs.TrySetResult(t2.Result);
});

t3.ContinueWith(_ =>
{
    if (t3.Result)
        tcs.TrySetResult(t3.Result);
});

t4.ContinueWith(_ =>
{
    if (t4.Result)
        tcs.TrySetResult(t4.Result);
});

tcs.Task.Wait();
return tcs.Task.Result;

タスクが戻ったときに正常に動作しますtrueが、以前の回答で気づいたように:

トリッキーなビットは、すべてのタスクが false を返したときに気付くことです... .NET 4.5 では、Task.WhenAll を介して別のタスクを作成することで、これはかなり簡単になります。

だから私はそれで遊んでみましたTask.WhenAllが、それを正しく使用したくありません...
私はそのようなことを試しました:

tcs.Task.Wait(); // stays block here when all tasks return false
Task tr = Task.WhenAll(new Task[] { t0, t1, t2, t3, t4 });

if (tr.IsCompleted)
   return false;
else
return tcs.Task.Result;

ご協力ありがとうございました

4

2 に答える 2

2

false使用できるときに結果を確認するには

if (!task.Result)
{ 
    // Do stuff...
}

これにより、ブール値の結果が false かどうかがチェックされます。より完全にするために、次のようなことができます

asyncTask.ContinueWith(task =>
{
    // Check task status.
    switch (task.Status)
    {
        case TaskStatus.RanToCompletion:
            if (asyncTask.Result)
            {
                // returned true.
            }
            else
            {
                // returned false
            }
            break;
        default:
            break;
    }
}

これが役立つことを願っています。

于 2012-08-07T09:42:44.437 に答える