2010-07-20 3 views
0

У меня есть веб-приложение silverlight 4, которое должно связываться с сервером, обратившись к веб-службе ASMX на сервере. У меня есть список (да, массив) объектов, которые мне нужно отправить (один за другим) в качестве параметра для службы. Однако перебираем список и запускаем метод (objecttosend); не будет работать, потому что мне нужно отправить один за другим, а Silverlight, похоже, поддерживает только Async (предположительно, чтобы не блокировать интерфейс - имеет смысл).ASMX webservices с Silverlight Async confusion

Так что я попытался это:

public void SendNextPart() 
    { 
     if (partsToSend.Count > 0) 
     { 
      Part thisPart = partsToSend.Dequeue(); 
      fuWS.createPartCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(fuWS_createPartCompleted); 
      fuWS.createPartAsync(thisPart); 

     } 
    } 
Queue<Part> partsToSend = new Queue<Part>(); 
    void fuWS_createPartCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
     { 
      SendNextPart(); 
     } 

Который, насколько я понимаю, будет проверять, чтобы увидеть, если список имеет части для отправки, а затем запустить WebService метод (называемый fuWS) и удалить, что часть из списка «Отправить список». Как только он получит завершенное событие, он должен снова запустить метод SendNextPart и отправить следующую часть.

Однако то, что происходит (это видно из просмотра HTTPwatch), заключается в том, что он отправляет первую часть, а затем отправляет сразу две части, а затем после этого все больше и больше. Почти так, как будто он получает завершенное событие до того, как оно действительно отправлено на сервер, и успешно запустить метод.

Пожалуйста, помогите, это до чертиков из меня, и это полностью разрушает то, что мне нужно сделать: '(

+0

Отправьте код функции, которая вызывает отправку следующей части. Отправьте код для SendNextBuffer. – BigChrisDiD

+0

Эй, извините, ive отредактировал оригинальную часть. Благодарю. – Matt

ответ

1

Я не вижу SendNextBuffer метод, который вы звоните в обратный вызов веб-службы обработчик события, но в любом случае, в лучшем случае ваш код имеет условие гонки. Если веб-сервис завершается и возвращается до того, как линия partsToSend.RemoveAt будет выполнена (теоретически возможно), вы можете сделать следующий запрос до того, как вы удалите тот, который вы просто отправлено.

Итак, сначала вы должны проверить, чтобы вы включили весь код в свой пример, если вы не указали на SendNextBuffer, чтобы сказать SendNextPart.

Во-вторых, вы должны переместить линию partsToSend.RemoveAtдо вызов веб-службы.

И, наконец, вы должны, вероятно, изменить список деталейToSend на Queue<Part> (сначала первый, первый) или Stack<Part> (последний в, первый раз), так как это то, что вы используете его как.

+0

Извините, что в редактировании этого места мне удалось изменить SendNextPart и SendNextBuffer на разные вещи: P Они одинаковы. Я отредактировал свое оригинальное сообщение, а также изменил код на использование очереди (FIFO или LILO оба прекрасны), но он по-прежнему работает точно так же – Matt

0

Итак, после использования Debug.WriteLine я понял, что я был идиотом. Проверьте эту линию:

fuWS.createPartCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(fuWS_createPartCompleted); 

Что это делает добавлял новый обработчик событий каждый раз, когда он должен был послать новую часть. Таким образом, вторая часть отправки теперь имела два обратных вызова, а третий - больше и т. Д., Увеличиваясь экспоненциально.

Смежные вопросы