异步方法结果来得太晚,因此返回错误的值

时间:2015-12-09 21:06:20

标签: c# asynchronous asp.net-web-api async-await

我创建了一个进行两次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!
}

2 个答案:

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