异步调用堆栈中的非异步方法

时间:2017-03-08 21:26:32

标签: c# async-await task

对于一个可怕的头衔,我只是想确认我做出了正确的假设。

假设我有3种方法简化为:

public async Task Method1()
{ 
    var obj = await Method2();
    //do work on obj
} 

public Task<object> Method2()
{
    //do some work
    return Method3();     
}

public async Task<object> Method3()
{
    //do async work
    return obj;
}
上面的

Method2内部没有异步工作,但是在我的异步堆栈中。它可以改写为:

public async Task<object> Method2()
{
    //do some work
    return await Method3();
}  

我是否正确,因为Method2实际上并不执行异步工作,最好将其保留为非异步方法?我的想法是,我节省了创建额外状态机的开销,以便在不需要时保存线程的资源。

1 个答案:

答案 0 :(得分:0)

正确。如果方法不需要等待任何结果(即,消耗任务的结果或等待任务完成,则可以直接从方法返回Task而不添加async/await关键字能够做一些执行)。然后,呼叫堆栈中的呼叫者可以等待返回的任务。这可以节省一些开销,并使略微更少的代码(虽然代码量实际上是微不足道的)。

您经常通过传递或便利方法看到这一点。