我创建了一个进行两次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!
}
答案 0 :(得分:1)
问题是你的继续。这运行在不同的线程上。并且你从那个线程返回一些东西,而不是原始方法中的东西。
你真正想要的是像这样编写你的代码
Id Month Date score
1 Jan 1 5
1 Jan 1 5
1 Jan 2 3
1 Jan 3 4
1 Jan 4 4
1 Jan 5 4
1 Feb 1 5
1 Feb 1 5
1 Feb 2 3
1 Feb 3 4
1 Feb 4 4
1 Feb 5 4
答案 1 :(得分:1)
使用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);
}