所以我发现这很烦人,使用自定义任务方法,我需要总是返回一个新的Task,就像下面的Foo0()一样。但有趣的是,在Xamarin中,如果放入async关键字,则可以删除返回的新Task块。
Foo0和Foo1是否相同?
这是Xamarin实现的故障,还是在VS2012中也能正常工作?
但是Foo1给出了一个编译器警告,我不能删除async关键字,否则它将停止编译,即使代码的主体保持不变。 (我发现Foo0中的额外新任务块是冗余的,从方法声明中我应该明白我想要运行一个新任务。)
// the following is explicit with returning a new task
Task<int> Foo0()
{
return Task.Run(() =>
{
return 5;
});
}
// the following gives warning "Async block lacks `await` operator and will run synchronously"
async Task<int> Foo1()
{
return 5;
}
/* the following does not compile
Task<int> Foo2()
{
return 5;
}
*/
答案 0 :(得分:8)
这是Xamarin实现的故障,还是在VS2012中也能正常工作?
这就是async
在C#中的作用(VS2012和Xamarin)。
从方法声明中我应该明白我想要运行一个新任务
完全没有。任务只不过是一个未来&#34 ;;它代表一个异步操作。 一种可能的方法是将工作排队到线程池(例如Task.Run
),但这是异步世界中的罕见的方法。 / p>
特别是,async
不队列工作到线程池。它没有在下面使用Task.Run
或类似的东西。当编译器警告状态时,它将同步运行(在当前线程上),然后返回已完成的任务。这几乎可以肯定是你不想要的,因此警告。
因此,Foo0
和Foo1
完全不同。 Foo0
队列工作到线程池并返回表示该工作的任务。 Foo1
立即完成工作,然后返回已完成的任务。
如果您想了解有关async
和await
的更多信息,我的博客上会有async
intro。