我正在观看一个名为Becoming a C# Time Lord的视频,在0:35:36这个代码弹出:
async Task<TResult[]> PurelyWhenAll<TResult> (params Task<TResult>[] tasks)
{
var killJoy = new TaskCompletionSource<TResult[]>();
foreach ( var task in tasks )
task.ContinueWith(ant =>
{
if ( ant.IsCanceled )
killJoy.TrySetCanceled();
else if ( ant.IsFaulted )
killJoy.TrySetException(ant.Exception.InnerException);
});
return await await Task.WhenAny(killJoy.Task, Task.WhenAll(tasks));
}
这是否意味着任务返回任务,因此我们有双等待?如果我们有两个以上的等待,那么就性能会发生什么?这是一种好的做法,如果要避免这种做法吗?
答案 0 :(得分:9)
Task.WhenAny
将返回Task<Task<TResult>>
:
Task.WhenAny()
的结果将返回完成的第一个任务TResult[]
。您可能会发现解释变量很容易理解:
var firstCompletedTask = await Task.WhenAny(killJoy.Task, Task.WhenAll(tasks));
var firstResult = await firstCompletedTask;
return firstResult;
不清楚为什么你关注这个的表现 - 它只是两个等待表达式,与使用两个等待表达式的任何其他方法没有特别的不同。
使用Task.WhenAny<TResult>(Task<TResult>[])
时执行此操作非常自然,因为返回类型为Task<Task<TResult>>
。
答案 1 :(得分:0)
您不必担心两个等待执行同一任务的性能。如果已经完成,则只需返回值即可,而无需再次运行任务。