Silverlight WCF с несколькими вызовами необходимо знать, когда все они завершены

Я работаю над приложением Small silverlight для изменения размера изображений на клиентском компьютере перед загрузкой на сервер через службу WCF. У меня все это работает, клиент подключается и загружает изображения, размеры меняются, но природа приложения такова, что пользователю показывается какая-то форма индикатора выполнения при загрузке изображений, и они больше не могут загружать, это вроде как работает.

Я думал, что подключу событие Completed вызова службы:

service.SaveImageCompleted += new EventHandler<AsyncCompletedEventArgs>(service_SaveImageCompleted);

Я думал, что могу просто заставить это работать, - это подсчитать количество всех вызовов, которые мне нужно сделать (количество изображений, выбранных для обработки), а затем просто выполнить проверку внутри обработчика событий Completed:

   void service_SaveImageCompleted(object sender, AsyncCompletedEventArgs e)
    {
        serviceCallsMade++;

        if (totalServiceCalls == serviceCallsMade)
        {
           // MessageBox.Show("Transactions Complete!");
           IsWorking = false;
           ProgressBarWorking.Visibility = Visibility.Collapsed;
           UploadButton.Visibility = Visibility.Visible;
           LayoutMessage.Visibility = Visibility.Visible;
        }
    }

Проблема, с которой я столкнулся, заключается в том, что то, что я считал последним вызовом (пользовательский интерфейс становится «разблокированным»), происходит задолго до того, как все вызовы службы фактически завершены (я смотрю на это через скрипач). Локально это сработало, но теперь я думаю, что это было потому, что оно было обработано быстро, и я не заметил, в предпроизводственной среде вы можете видеть, что моя реализация не работает :).

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

Любая помощь приветствуется.

Роб


person Modika    schedule 08.06.2011    source источник


Ответы (1)


Это должно работать, пока обработка на стороне сервера выполняется в одном потоке. Если вы действительно запускаете другой поток, то завершенное событие потенциально будет выполнено до того, как будет выполнена фактическая работа.

person Jeff Machamer    schedule 08.06.2011
comment
Спасибо, Джефф, есть ли что-нибудь особенное, что мне нужно сделать, чтобы сервис работал в одном потоке? - person Modika; 10.06.2011
comment
Он будет работать с одним потоком, если вы не заставите его этого не делать. Вы бы знали, если бы делали это. Другой вариант заключается в том, что какой-то сторонний код, который вы используете, использует несколько потоков. Я определенно мог видеть сторонний код, использующий несколько потоков для обработки изображений ... - person Jeff Machamer; 10.06.2011