.Net 4.6
使用await的具有“异步”功能的调用方法与没有“异步”或没有异步功能的调用方法有什么区别?
protected Task<MyObject<T>> MyMethod1<T>(string parameter)
{
return CallDb();
}
protected async Task<MyObject<T>> MyMethod2<T>(string parameter)
{
return await CallDb();
}
// Calling these
public async Task<IEnumerable<string>>(string parameter)
{
return await MyMethod1<string>(parameter);
// Any difference?
return await MyMethod2<string>(parameter);
}
public Task<string> CallDb()
{
}
答案 0 :(得分:6)
如果您谈论的是MyMethod1
和MyMethod2
之间的区别,那么在这种情况下,唯一的区别是MyMethod2
的开销稍大以及在引发异常的方式上有一些非常细微的差异(指责谁)。具体来说,MyMethod2
最终将分配一个额外的任务,并且将具有一些额外的异步状态机样板,如果{{ 1}}证明是不完整的。
通常,如果您不需要做任何额外的事情(值的{/ {1}},CallDb
等的前/后处理),我建议您using
-即,不要无故引入finally
机制。
答案 1 :(得分:1)
在await
调用中,任务正在执行并等待。这导致很多事情发生。通常会捕获上下文,有时会弹出一个线程,Stephen可以为您提供更多信息。
如果您只返回一个Task
,则由调用者决定await
(或保留它)。
如果您嵌套了await
,这会导致额外的开销。因此,如有必要,请勿使用await
,而应尽可能返回Task
。
答案 2 :(得分:0)
使用await的具有“异步”功能的调用方法与没有“异步”或没有异步功能的调用方法有什么区别?
调用这些方法完全没有区别。在运行时,两个方法都只返回一个Task<T>
。 await
消耗了等待的时间(通常是一项任务);任务来自哪里都没有关系。 async
是实现细节。
这些方法的实现有所不同,但这在this question中已涵盖。