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

C# async await是否也适用于调用的方法,c#,.net,asynchronous,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); } 我的问

我有以下代码:

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

        if (res == null)
        {
            return BadRequest("Fail");
        }
        return Ok(res);
    }
我的问题与
ClassMethod
中的异步有关

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

但是在
wait
实现后,wait函数是否会应用于ClassMethod函数中调用的方法,例如
followClassMethod
中的代码是否也应用了wait,或者我是否还需要将
wait
添加到
followClassMethod

如果wait将应用于
followClassMethod
,它也将应用于
followClassMethod
等中调用的任何方法。如果是,它将在什么时候停止应用

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

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

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

然而,我们还需要知道
followClassMethod
返回什么。它看起来像是返回
string
,在这种情况下,
async
是不相关的,并且该方法总是同步执行,只是返回一个已经完成的任务;这意味着
var res=
延续也会立即/同步执行。另外,您可能已经收到编译器警告:

警告CS1998此异步方法缺少“await”运算符,将同步运行。考虑使用“Acess”操作符等待非阻塞API调用,或“等待任务.Run(…)”在后台线程上执行CPU绑定的工作。 这说明
async
没有做任何有用的事情

至于:

或者我还需要向followClassMethod添加wait

除非
followClassMethod
的结果本身是可等待的,否则您不能这样做-例如
Task
;然后,天真的方法是写:

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

在上面的例子中,我可以看到没有必要将ClassMethod设置为async。然而,如果有必要将其作为一个异步任务,那么您似乎在说我还必须在ClassMethod中指定wait,否则它将是异步的?@Alex,这取决于您认为“asasasync”是什么意思。这里真的有真正异步的东西吗?编写
async
/
await
并不是为了让某些东西变得异步——它只是触发了编译器的魔力,使编写异步代码成为可能,而不会变得疯狂。至于你的最后一个问题:不,我明确给出了一个例子,其中
ClassMethod
不是
async
,但正确地通过了
followclassmethod
的等待性质(假设现在是
async
)@MarcGravel:我认为
异步
/
等待
类方法
代码中可能很有用。特别是,如果
NextClass
构造函数抛出(非bonehead)异常。
public async static Task<string> ClassMethod(string text)
{
    NextClass followingClass = new NextClass();
    return await followingClass.followingClassMethod(text);
}
public static Task<string> ClassMethod(string text)
{
    NextClass followingClass = new NextClass();
    return followingClass.followingClassMethod(text);
}