【问题标题】:Async method result arrive too late so it return a wrong values异步方法结果到达太晚,因此它返回错误的值
【发布时间】:2023-03-24 09:56:01
【问题描述】:

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

【问题讨论】:

  • 为什么要混合async/awaitContinueWith
  • 有没有可能抛出异常?使用空的catch 块,您将“跌倒”到最后的return,并且看不到任何表明有问题的东西。只是一个想法。
  • 你不应该有这样的空catch。至少,您应该记录错误。
  • @IvanStoev 我第一次使用 async/await :-/

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


【解决方案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);
}

【讨论】:

    【解决方案2】:

    问题在于您的 continueWith。那在不同的线程上运行。你从那个线程返回一些东西,而不是你原来的方法。

    你真正想要的是这样写你的代码

    var r = await oneMoreAsyncCall()
    if (r.IsCompleted == true)
    {                   
        return Request.CreateResponse(HttpStatusCode.OK, someData); // Hit second!
    }      
    

    【讨论】:

    • oneMoreAsyncCall() 使用返回 Task&lt;IEnumerable&lt;T&gt;&gt; 的方法 FindAsync() 所以我没有 IsCompleted 那里。
    • @1110 你是对的,你在等待之后不会有任务,但是如果你已经等待了任务,为什么还需要检查 IsCompleted。如果需要,您始终可以将任务保存在变量中,然后等待。
    • @1110 该任务在其延续触发时永远不会完成(等待它在延续中运行后续代码),因此您的代码本质上只是if(true){ ... },这与省略@987654327 相同@.
    • 好的,我用你的建议修复了代码,它可以工作var result = await AsyncMethodCall。但我不明白到底是什么问题?如果我使用await,这是等待同步调用之类的响应吗?
    • @1110 不,它没有。有数以千计的关于该主题的教程,您可以选择包含更多信息的资源。当然,您真的应该在开始使用它之前 这样做。如果您甚至不知道它做了什么,那么您不应该在您最初拥有的代码中使用它
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多