2017-02-18 66 views
0

嘗試通過異步調用從Web服務請求數據。循環 - 使用異步事件

開始了一個類似的Wait until event has finished後,在這種情況下,我能夠使用None-Async方法。現在情況並非如此。目前的Web服務沒有None-Async方法。那麼,我將如何開始並確定在事件「RespService_Send_Completed」中事件是否在啓動/繼續循環中的下一行之前完成。如果事件成功,則來自webservice的返回是「e.Result」中的UUID。調用方法

public void InvokeSend(string[] uuid) 

在串[] UUID一個值時

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

代碼工作正常。但是當數組包含多於一個的代碼將會失敗。

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

回答

0

_uuid私人領域可能是您的問題的原因。

具體來說,foreach循環不會等待完成的事件發生,然後繼續下一個id。每個迭代將覆蓋_uuid字段,並且由於循環將會很快 - 除非有很多(千次)創建調用,否則循環將在完成任何已完成事件之前完成。根本沒有辦法知道什麼值_uuid將被設置爲當完成的事件是rasied。

當所有完成的事件發生時,最有可能的循環將完成,並且_uuid將是最後的id

我需要知道更多關於你打電話來確定的API,但xxxxAsync()方法通常會返回Task<>。無論是否爲Task<>或其他,請將所有返回值保存在數組中,並在完成時從數組中刪除。

再一次,沒有關於API的更多信息,就不能更具體。

0

我通過調用事件的「InvokeSend」方法解決了這個問題。然後處理髮送給Class的數組,在每次迭代後刪除「當前」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); 
    } 
}