我可以在Xamarin中声明没有任务块的任务吗?

时间:2014-04-28 15:05:31

标签: c# xamarin async-await

所以我发现这很烦人,使用自定义任务方法,我需要总是返回一个新的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;
}
*/

1 个答案:

答案 0 :(得分:8)

  

这是Xamarin实现的故障,还是在VS2012中也能正常工作?

这就是async在C#中的作用(VS2012和Xamarin)。

  

从方法声明中我应该明白我想要运行一个新任务

完全没有。任务只不过是一个未来&#34 ;;它代表一个异步操作。 一种可能的方法是将工作排队到线程池(例如Task.Run),但这是异步世界中的罕见的方法。 / p>

特别是,async 队列工作到线程池。它没有在下面使用Task.Run或类似的东西。当编译器警告状态时,它将同步运行(在当前线程上),然后返回已完成的任务。这几乎可以肯定是你不想要的,因此警告。

因此,Foo0Foo1完全不同。 Foo0队列工作到线程池并返回表示该工作的任务。 Foo1立即完成工作,然后返回已完成的任务。

如果您想了解有关asyncawait的更多信息,我的博客上会有async intro