呼叫同步和异步方法有什么不同吗?

时间:2019-07-24 07:19:27

标签: c# async-await

.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()
{
}

3 个答案:

答案 0 :(得分:6)

如果您谈论的是MyMethod1MyMethod2之间的区别,那么在这种情况下,唯一的区别是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中已涵盖。