Веб-сервисы ASMX с путаницей Silverlight Async - PullRequest
0 голосов
/ 20 июля 2010

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

Итак, я попробовал это:

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

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

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

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

Ответы [ 2 ]

1 голос
/ 20 июля 2010

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

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

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

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

0 голосов
/ 21 июля 2010

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

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

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

...