循环 - 使用异步事件

时间:2017-02-18 12:05:06

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

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

开始了一个类似的Wait until event has finished帖子,在这种情况下我可以使用None-Async方法。现在情况并非如此。当前的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) 

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

2 个答案:

答案 0 :(得分:0)

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

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

很有可能循环结束,_uuid将成为所有已完成事件的最后id

我需要了解有关您确实要知道的API的更多信息,但xxxxAsync()方法通常会返回Task<>。无论是Task<>还是其他内容,都要保存数组中的所有返回值,并在完成后从数组中删除。

同样,如果没有关于API的更多信息,则无法更具体。

答案 1 :(得分:0)

我通过调用&#34; InvokeSend&#34;解决了这个问题。 - 事件的方法。然后处理发送到Class的数组,删除&#34; Current&#34;每次迭代后的uuid值。直到数组为空。

Source_song_id