async await是否也适用于调用的方法

时间:2016-12-22 12:21:08

标签: c# .net asynchronous

我有以下代码:

    public async Task<IHttpActionResult> GetInfo(string text)
    {
        var res = await Class.ClassMethod(text);

        if (res == null)
        {
            return BadRequest("Fail");
        }
        return Ok(res);
    }

这是ClassMethod

    public async static Task<string> ClassMethod(string text)
    {
        NextClass followingClass = new NextClass();
        return followingClass.followingClassMethod(text);
    }

我的问题与ClassMethod中的异步有关。

在这种情况下,使用Class.ClassMethod(text)调用await,据我所知,这意味着该方法将不再是异步,而是按顺序执行。到目前为止一切都很好。

但是,在实现await之后,await函数是否会应用于ClassMethod函数中调用的方法,例如followingClassMethod中的代码是否也会等待应用,或者我还需要添加{{1转到await

如果await适用于followingClassmethod,它也适用于followingClassMethod中调用的任何方法,依此类推。如果是这样,它将在什么时候停止申请?

如果它不适用,这是否意味着在followingClassMethod中构造函数和方法将同时执行?这显然是行不通的。如果是这种情况,我该怎么做才能解决这个问题,因为我无法使用异步调用构造函数?我已经看到一些答案说要将构造函数包装在一个方法中并使其异步,但在我看来这有点像hacky?

1 个答案:

答案 0 :(得分:1)

  

用await调用,据我所知,这意味着该方法将不再是异步,而是按顺序执行。

不,这不是它的意思;这意味着左侧和下方的所有内容(var res =等)都将成为延续的一部分,并且只有在等待的事情(Class.ClassMethod(text)的结果)后才会执行表示完成。

但是,我们还需要知道followingClassMethod返回的内容。看起来它返回string,在这种情况下async是无关紧要的,并且该方法总是同步执行并简单地返回已经完成的任务;这意味着var res =延续立即/同步执行。顺便说一下,你可能已经收到编译器警告:

  

警告CS1998此异步方法缺少'await'运算符并将同步运行。考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作。

告诉你async没有做任何有用的事情。

至于:

  

或者我还需要添加await到followingClassmethod。

除非followingClassmethod的结果本身是等待的,否则你不能这样做 - 例如Task<string>; 天真的方法就是写:

public async static Task<string> ClassMethod(string text)
{
    NextClass followingClass = new NextClass();
    return await followingClass.followingClassMethod(text);
}

然而,这会增加一个不必要的抽象级别,并且只会因为async而无法获得任何收益:

public static Task<string> ClassMethod(string text)
{
    NextClass followingClass = new NextClass();
    return followingClass.followingClassMethod(text);
}