我有以下代码:
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?
答案 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);
}