【问题标题】:Loop - with Async event循环 - 带有异步事件
【发布时间】:2017-07-07 23:33:28
【问题描述】:

尝试通过异步调用从 Web 服务请求数据。

开始了类似的Wait until event has finished 帖子,在这种情况下,我能够使用无异步方法。现在情况并非如此。当前的 Web 服务没有可用的 None-Async 方法。那么我将如何开始并确定来自事件“RespService_Send_Completed”的事件是否在启动/继续循环中的下一行之前完成。如果事件成功,则来自 web 服务的返回是“e.Result”中的 UUID。

foreach (string id in uuid)
    {
        WebRef.ResponderService RespService = new WebRef.ResponderService();
        _uuid = id;
        RespService.SendDataAsync(id);
        RespService.SendCompleted += RespService_Send_Completed;
    }

调用方法时代码运行良好

public void InvokeSend(string[] uuid) 

在 string[] uuid 中有一个值。但是当数组包含多个时,代码会失败。

public class SendReciveSoapData
{
    private string _uuid { get; set; }

    public void InvokeSend(string[] uuid)
    {
        foreach (string id in uuid)
        {
            WebRef.ResponderService RespService = new WebRef.ResponderService();
            _uuid =id;
            RespService.SendDataAsync(id);
            RespService.SendCompleted += RespService_Send_Completed;
        }

    }
    void RespService_Send_Completed(object sender, WebRef.CompletedEventArgs e)
    {
        //Saving Response Data to database
        string SuccessID = e.Result;
        string TransactionID = _uuid;
        DataBase db = new DataBase();
        db.UpdateResponseID(SuccessID, TransactionID);
    }
}

【问题讨论】:

    标签: c# asp.net web-services asynchronous


    【解决方案1】:

    _uuid 私有字段可能是您的问题的原因。

    具体来说,foreach 循环不会等待完成的事件发生,然后继续下一个id_uuid 字段将在每次迭代时被覆盖,并且由于循环会很快——除非有很多(数千)次调用创建,否则循环将在任何已完成的事件引发之前完成。根本无法知道当完成的事件被触发时_uuid 将被设置为什么值。

    循环很可能已经结束,_uuid 将是引发所有已完成事件时的最后一个 id

    我需要进一步了解您调用的 API 才能确定,但​​ xxxxAsync() 方法通常返回 Task<>。不管是Task<>还是别的什么,把所有的返回值保存在一个数组中,完成后从数组中删除。

    再次重申,如果没有关于 API 的更多信息,就再具体不过了。

    【讨论】:

      【解决方案2】:

      我通过从事件中调用“InvokeSend”方法解决了这个问题。然后处理发送到类的数组,在每次迭代后删除“当前”uuid-value。直到数组为空。

      public class SendReciveSoapData
      {
          private string[] UUID_array { get; set; }
          private string CurrentUUID { get; set; }
      
          public void InvokeSend(string[] uuid_array)
          {
              int len = uuid_array.Length;
              if (len > 0)
              {
                  CurrentUUID = uuid_array[0].ToString();
                  string strToRemove = CurrentUUID;
                  UUID_array = uuid_array.Where(val => val != strToRemove).ToArray();
                  invokeSend(CurrentUUID);
              }
          }
          private void invokeSend(string uuid)
          {
              CurrentUUID=uuid;
              WebRef.ResponderService RespService = new WebRef.ResponderService();
              RespService.SendDataAsync(uuid);
              RespService.SendCompleted += RespService_Send_Completed;
          }
          void RespService_Send_Completed(object sender, WebRef.CompletedEventArgs e)
          {
              //Saving Response Data to database
              string SuccessID = e.Result;
              string TransactionID = CurrentUUID;
              DataBase db = new DataBase();
              db.UpdateResponseID(SuccessID, TransactionID);
              InvokeSend(UUID_array);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-18
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        • 2019-08-04
        相关资源
        最近更新 更多