【发布时间】:2013-10-07 21:50:39
【问题描述】:
按照this question(及其答案),我想使用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 这将相当容易,通过创建另一个任务 任务.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;
感谢您的帮助
【问题讨论】:
-
即使所有任务都返回false,如何使用Task.WhenAll获取结果?
标签: c# task async-await