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

本文关键字:任务 Xamarin 声明 我可以 | 更新日期: 2023-09-27 18:00:37

所以我发现,使用自定义任务方法时,我总是需要返回一个新的task,就像下面的Foo0()中一样。但有趣的是,在Xamarin中,如果放入async关键字,则可以删除返回的新Task块。

Foo0和Foo1等价吗?

这是Xamarin实现中的一个小故障,还是在VS2012中也适用?

但是Foo1给出了编译器警告,我不能只删除async关键字,否则即使代码体保持不变,它也会停止编译。(我发现Foo0中额外的新Task块是多余的,从方法声明中应该可以明显看出,我想运行一个新任务。)

// 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;
}
*/

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

这是Xamarin实现中的一个小故障,还是在VS2012中也适用?

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

从方法声明中可以明显看出,我想运行一个新任务

一点也不。一项任务不过是一个"未来";它表示一个异步操作一种可能的方法是将工作排队到线程池(如Task.Run),但这在异步世界中是一种罕见的方法。

特别是,async对线程池执行而不是队列工作。它没有在下面使用Task.Run或类似的东西。正如编译器警告所说,它将同步运行(在当前线程上),然后返回一个已经完成的任务。这几乎可以肯定是你不想要的,因此发出了警告。

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

如果你想了解更多关于asyncawait的信息,我在博客上有一个async介绍。