2017-02-18 11 views
0

Попытка запроса данных с Web-сервиса с помощью вызова Async.Loop - с событием Async

Начато аналогичное сообщение Wait until event has finished, в этом случае я смог использовать метод None-Async. Сейчас это не так. Нет метода None-Async, доступного с текущим веб-сервисом. Итак, как бы я пошел в голову и определить, закончилось ли событие из события «RespService_Send_Completed», прежде чем инициировать/перейти к следующей строке в цикле. Если событие успешное, возвращение из web-сервиса является UUID в «e.Result».

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

ответ

0

_uuid частное поле, скорее всего, причиной вашей проблемы.

В частности, цикл foreach не будет ждать завершения завершенного события, прежде чем перейти к следующему id. Поле _uuid будет перезаписано каждой итерацией, и поскольку цикл будет быстрым - если не будет много (тысяч) вызовов для создания, цикл завершится до того, как какое-либо из завершенных событий будет поднято. Существует просто нет способа узнать, какое значение будет установлено значение _uuid, когда закончится заполненное событие.

Скорее всего, цикл завершится, и _uuid будет последним id, когда все завершенные события будут подняты.

Мне нужно знать больше об API, который вы звоните, чтобы знать наверняка, но методы xxxxAsync() обычно возвращают Task<>. Независимо от того, является ли это Task<> или чем-то еще, сохраните все возвращаемые значения в массиве и удалите из массива по завершении.

Опять же, не может быть более конкретным без дополнительной информации об API.

0

Я решил проблему, вызвав «InvokeSend» -метод из события. Затем работаем через массив, который был отправлен в класс, удалив значение «Current» 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); 
    } 
}