我可以在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实现中的一个小故障,还是在VS2012中也适用?
这就是async
在C#(VS2012和Xamarin)中的工作方式。
从方法声明中可以明显看出,我想运行一个新任务
一点也不。一项任务不过是一个"未来";它表示一个异步操作一种可能的方法是将工作排队到线程池(如Task.Run
),但这在异步世界中是一种罕见的方法。
特别是,async
对线程池执行而不是队列工作。它没有在下面使用Task.Run
或类似的东西。正如编译器警告所说,它将同步运行(在当前线程上),然后返回一个已经完成的任务。这几乎可以肯定是你不想要的,因此发出了警告。
因此,Foo0
和Foo1
是完全不同的。Foo0
将工作排队到线程池,并返回表示该工作的任务。Foo1
立即完成工作,然后返回已完成的任务。
如果你想了解更多关于async
和await
的信息,我在博客上有一个async
介绍。