三大返回值;
当你添加 async 关键字后,需要返回一个将用于后续操作的对象,请使用 Task<TResult>。
当你如果只是想知道执行的状态,而不需要知道具体的返回结果时,请使用 Task。
当你如果在触发后,你不想管了,请使用 void。如事件处理程序。
ps:这里还有一篇好文章;https://msdn.microsoft.com/zh-cn/magazine/jj991977.aspx
一些异步编程的实践原理;
1.避免 Async Void
当 async Task 或 async Task<T> 方法引发异常时,会捕获该异常并将其置于 Task 对象上。
对于 async void 方法,没有 Task 对象,因此 async void 方法引发的任何异常都会直接在 SynchronizationContext(在 async void 方法启动时处于活动状态)上引发
private async void ThrowExceptionAsync() { throw new InvalidOperationException(); } public void AsyncVoidExceptions_CannotBeCaughtByCatch() { try { ThrowExceptionAsync(); } catch (Exception) { // The exception is never caught here! throw; } }
Async void 方法具有不同的组合语义。 返回 Task 或 Task<T> 的 async 方法可以使用 await、Task.WhenAny、Task.WhenAll 等方便地组合而成。
返回 void 的 async 方法未提供一种简单方式,用于向调用代码通知它们已完成。 启动几个 async void 方法不难,但是确定它们何时结束却不易。
Async void 方法会在启动和结束时通知 SynchronizationContext,但是对于常规应用程序代码而言,自定义 SynchronizationContext 是一种复杂的解决方案。
二:
原文:http://www.cnblogs.com/mc67/p/6259297.html