结果与ContinueWith之间的C#差异

PCH*_*PCH 9 c# asynchronous task-parallel-library async-await

这两种似乎做同样事情的方法有什么区别?即使使用async/await也可以完成吗?

public Task<int> TaskMaxAsync1 ( Task<int>[] my_ints )
{
    return Task.WhenAll( my_ints )
    .ContinueWith ( x => x.Result.Where ( i => i%2 != 0 ).Max( ) ) ;
}

public Task<int> TaskMaxAsync2 ( Task<int>[] my_ints )
{
    var numbers = Task.WhenAll( my_ints ).Result ;
    return Task.FromResult( numbers.Where( i => i%2 != 0 ).Max( ) ) ;
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 7

这两种似乎做同样事情的方法有什么区别?

区别在于前者将热任务返回给调用者,而后者同步阻塞,然后将结果重新包装到Task使用中Task.FromResult.如果您在具有自定义的环境中运行,后者也是死锁的常见情况SynchronizationContext.

即使使用async/await也可以完成吗?

是的,它可以:

public async Task<int> MaxAsync(Task<int>[] myInts)
{
    int[] results = await Task.WhenAll(myInts);
    return results.Max(i => i % 2 != 0 ? i : (int?)null) ?? 0;
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ary 7

Result和ContinueWith之间的差异

Result将同步阻塞,直到任务完成,并将异常包装在一个AggregateException.

ContinueWith 将在任务中注册回调,并在任务完成时调用该回调.

对于异步代码,两者ResultContinueWith应被替换await.

即使使用async/await也可以完成吗?

当然,像这样:

public async Task<int> MaxAsync(Task<int>[] my_ints)
{
  int[] ints = await Task.WhenAll(my_ints);
  return ints.Where(i => i % 2 != 0).Max();
}
Run Code Online (Sandbox Code Playgroud)