2017-02-18 10 views
0

非同期呼び出しによるWebサービスからのデータ要求を試みています。ループ - 非同期イベント付き

投稿が同様のWait until event has finished投稿を開始しました。この場合、私はNone-Asyncメソッドを使用できました。これは今の場合ではありません。現在のWebサービスでは、None-Asyncメソッドは使用できません。だから、私は頭を下ろして、イベント "RespService_Send_Completed"からのイベントが、ループの次の行で開始/移動する前に終了したかどうかを判断します。イベントが成功すると、Webサービスからの戻り値は "e.Result"のUUIDになります。文字列[] UUID内の1つの値を持つメソッド

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

コードが正常に動作します。しかし、配列に複数の要素が含まれていると、コードは失敗します。

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が最後のidになる可能性があります。

具体的に知るために呼び出すAPIについて詳しく知っておく必要がありますが、xxxxAsync()メソッドは通常Task<>を返します。それがTask<>かどうかにかかわらず、戻り値のすべてを配列に保存し、完了したら配列から削除します。

APIについて詳しく説明しなくても、これ以上具体的にすることはできません。

0

イベントから「InvokeSend」メソッドを呼び出して問題を解決しました。その後、クラスに送信された配列を処理し、各繰り返しの後に "Current" 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); 
    } 
}