【发布时间】:2012-08-22 01:33:21
【问题描述】:
想在什么场景下使用
public async Task AsyncMethod(int num)
而不是
public async void AsyncMethod(int num)
我能想到的唯一场景是您是否需要任务能够跟踪其进度。
另外,在下面的方法中,async和await关键字是不是不必要的?
public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}
【问题讨论】:
-
请注意,异步方法应始终以名称 Async 为后缀。示例
Foo()将变为FooAsync()。 -
@Fred 大多数情况下,但并非总是如此。这只是约定,该约定的公认例外是基于事件的类或接口契约see MSDN。例如,您不应重命名常见的事件处理程序,例如 Button1_Click。
-
请注意,您不应该在任务中使用
Thread.Sleep,而应该使用await Task.Delay(num) -
@fred 我不同意这一点,IMO 添加异步后缀仅应在您提供具有同步和异步选项的接口时使用。当只有一个意图时,Smurf 用异步命名事物是没有意义的。例如
Task.Delay不是Task.AsyncDelay,因为任务上的所有方法都是异步的 -
今天早上我遇到了一个关于 webapi 2 控制器方法的有趣问题,它被声明为
async void而不是async Task。该方法崩溃是因为它使用了一个声明为控制器成员的实体框架上下文对象,该对象在方法完成执行之前被释放。框架在其方法完成执行之前就将控制器配置好了。我将方法更改为 async Task 并且它起作用了。
标签: c# asynchronous .net-4.5