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

本文关键字:返回 错误 结果 异步方法 | 更新日期: 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);
}