异步方法结果到达得太晚,因此返回了错误的值
本文关键字:返回 错误 结果 异步方法 | 更新日期: 2023-09-27 18:26:15
我创建了一个方法,用于进行两个async
调用
方法必须返回值,所以我在获取数据时有return
,在末尾有return
,这是一些默认值
问题是,当我对服务进行第二次调用时,我会等待它的结果,但方法末尾的默认return
会首先执行,当第二次呼叫结果到达时,我无法处理它,因为为时已晚
这段代码在网页调用的web api中。
public async Task<HttpResponseMessage> SomeMethod()
{
try
{
await login...;
await doSomething....ContinueWith(x => {
if (x.IsCompleted == true)
{
oneMoreAsyncCall.ContinueWith(r =>
{
if (r.IsCompleted == true)
{
return Request.CreateResponse(HttpStatusCode.OK, someData); // Hit second!
}
}
}
}
catch {}
return Request.CreateResponse(HttpStatusCode.SeeOther); // Hit first!
}
问题在于您的continueWith。它在不同的线程上运行。并且您正在从该线程返回一些东西,而不是从您的原始方法返回一些东西。
你真正想要的是像这样写你的代码
var r = await oneMoreAsyncCall()
if (r.IsCompleted == true)
{
return Request.CreateResponse(HttpStatusCode.OK, someData); // Hit second!
}
使用async/await
时,不必使用ContinueWith
并检查IsCompleted
,因为只有当等待的任务完成时,才会命中await
之后的代码。你的代码应该像这个
public async Task<HttpResponseMessage> SomeMethod()
{
try
{
await login...;
await doSomething....
await oneMoreAsyncCall...
return Request.CreateResponse(HttpStatusCode.OK, someData);
}
catch {}
return Request.CreateResponse(HttpStatusCode.SeeOther);
}