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);
}