1)通常,您需要返回
Task。主要的例外应该是当您 需要
具有
void返回类型(用于事件)时。如果没有理由不允许调用者执行
await您的任务,为什么要禁止它呢?
2)
async返回的方法
void在另一方面是特殊的:它们代表 顶级异步操作
,并且在您的任务返回异常时会起作用。最简单的方法是通过一个示例来显示差异:
static async void f(){ await h();}static async Task g(){ await h();}static async Task h(){ throw new NotImplementedException();}private void button1_Click(object sender, EventArgs e){ f();}private void button2_Click(object sender, EventArgs e){ g();}private void button3_Click(object sender, EventArgs e){ GC.Collect();}f的例外始终是“遵守”。留下顶级异步方法的异常就像其他未处理的异常一样被对待。
g从未观察到例外。当垃圾收集器清理任务时,它会看到任务导致异常,并且没有人处理该异常。发生这种情况时,
TaskScheduler.UnobservedTaskException处理程序将运行。您绝对不要让这种情况发生。以您的示例为例,
public static async void AsyncMethod2(int num){ await Task.Factory.StartNew(() => Thread.Sleep(num));}是的,请使用
async,
await在这里,它们可以确保如果引发异常,您的方法仍然可以正常工作。
有关更多信息,请参见:http :
//msdn.microsoft.com/zh-
cn/magazine/jj991977.aspx



