我正在研究C#中的异步编程,并想知道这些函数之间的区别,它们都执行完全相同的操作并且都是可等待的。
public Task<Bar> GetBar(string fooId)
{
return Task.Run(() =>
{
var fooService = new FooService();
var bar = fooService.GetBar(fooId);
return bar;
});
}
public Task<Bar> GetBar(string fooId)
{
var fooService = new FooService();
var bar = fooService.GetBar(fooId);
return Task.FromResult(bar)
}
public async Task<Bar> GetBar(string fooId)
{
return await Task.Run(() =>
{
var fooService = new FooService();
var bar = fooService.GetBar(fooId);
return bar;
});
}
我猜第一种方式是正确的做法,直到你试图从返回的任务中获取结果之前,代码不会被执行。
在第二种方式中,代码在调用时执行,结果存储在返回的任务中。
第三种方式有点像第二种?代码在调用时执行,并返回Task.Run的结果?在这种情况下,这个函数有点愚蠢吗?
我是对还是错呢?
async/await
只是使等待更容易,它并没有使任何东西异步化。第三个实际上有一些不必要的冗余,因为函数内部实际上并没有使用结果。 - Panagiotis KanavosGetBar
作为真正的异步GetBarAsync
公开,而不使用底层的Task.Run
。这将是另一种选择。 - Marc Gravell