循环 - 与异步事件进行



尝试通过async呼叫从Web服务请求数据。

开始了类似的等待,直到事件结束,在这种情况下,我能够使用无轴向方法。现在事实并非如此。当前的Web服务尚无无用的方法。因此,我将如何确定事件中的事件" 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) 

在字符串[] 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);
    }
}

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

具体来说,foreach循环不会等待完成的事件,然后再继续进行下一个id_uuid字段将被每次迭代覆盖,并且由于循环将很快 - 除非有很多(数千)呼叫要创建,否则循环将在提出任何完整的事件之前完成。根本没有办法知道完成完成事件时将设置什么值_uuid

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

我需要更多地了解您要呼吁了解的API,但是xxxxAsync()方法通常返回Task<>。无论是Task<>还是其他东西,都将所有返回值保存在数组中,并在完成时从数组中删除。

再次,如果没有有关API的更多信息,就不能更具体。

我解决了该问题,称之为事件中的" InvokEsend" -Method。然后通过发送到班级的数组进行工作,在每次迭代后删除"当前" UUID值。直到数组为空。

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

相关内容

  • 没有找到相关文章

最新更新