我是一名有用的助手,可以为您翻译文本。
据我所知,async/await关键字是无用的,可以避免使用,示例如下:
如果我理解正确,可等待方法并不总是在另一个线程上运行?我的猜测是第三个示例提供了这种机制(但是如何实现的?我只看到第三个示例中的同步代码),而示例1和2将始终在工作线程上运行?
可能还有其他编写可等待方法的方式,请告诉我。
我正在编写一些可等待的方法,并在互联网上找到了许多可以这样做的方式。所以我来这里了解每种方式的实际情况,以及是否必须淘汰某些方式。
据我所知,有两种可等待的方法:
调用其他可等待方法的方法:
public async Task<Foo> GetFooAsync()
{
var foo = await TrulyGetFooAsync();
// Do stuff with foo
return foo;
}
我没有发现其他做法,我认为这是正确的方法。如果我错了,请告诉我!
只调用不可等待方法的函数:
接下来我会讲到一些问题。
例如,我看到了这个:
例子1
public async Task<Foo> GetFooAsync()
{
return await Task.Run(() => TrulyGetFoo());
}
据我所知,async/await关键字是无用的,可以避免使用,示例如下:
示例2
public Task<Foo> GetFooAsync()
{
return Task.Run(() => TrulyGetFoo());
}
这是我一直在做的最后一个例子。关于这个问题,下面两种方式有什么不同:
Task.Run(() => TrulyGetFoo());
并且
Task.Run((Foo)TrulyGetFoo); // I don't know if the cast is required at any time but in my code, it was
我最近发现了这种方法:
例子三
public Task<Foo> GetFooAsync()
{
TaskCompletionSource<Foo> tcs = new TaskCompletionSource<Foo>();
tcs.SetResult(TrulyGetFoo());
return tcs.Task;
}
如果我理解正确,可等待方法并不总是在另一个线程上运行?我的猜测是第三个示例提供了这种机制(但是如何实现的?我只看到第三个示例中的同步代码),而示例1和2将始终在工作线程上运行?
可能还有其他编写可等待方法的方式,请告诉我。
return Task.FromResult(TrulyGetFoo())
来执行相同的操作。" - Evk