【发布时间】:2017-09-09 15:06:10
【问题描述】:
我正在写一些等待的方法,我在互联网上找到了很多方法。所以我来到这里是为了了解每条道路上真正发生的事情,以及是否必须取消某些道路。
据我所知,有两种等待方法:
那些调用其他等待方法的:
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
???
但我最近发现了这种方式:
示例 3
public Task<Foo> GetFooAsync()
{
TaskCompletionSource<Foo> tcs = new TaskCompletionSource<Foo>();
tcs.SetResult(TrulyGetFoo());
return tcs.Task;
}
如果我理解正确,可等待的方法并不总是在另一个线程上运行???我的猜测是第三个示例提供了这种机制(但是如何???我在第三个示例中只看到同步代码),当示例 1 和 2 将始终在工作线程上运行时???
可能还有其他方法可以编写可等待的方法,所以请告诉我。
【问题讨论】:
-
另一种方式:public Task
GetFooAsync() { return TrulyGetFooAsync(); } -
是的,当然。我已经简化了这个例子太多,你的话是对的。我将编辑我的问题以澄清!
-
“我在第三个例子中只看到同步代码”——它是完全同步的。任务将返回已经完成的状态。在这种情况下,您可以对
return Task.FromResult(TrulyGetFoo())执行相同的操作。
标签: c# async-await