Как заблокировать Silverlight, пока не будет выполнена серия вызовов Async WCF? - PullRequest
0 голосов
/ 07 февраля 2012

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

Однако, когда у меня более 1 файла, я сталкиваюсь с некоторыми проблемами. Внешний цикл, содержащий данные для каждого файла, продолжается до завершения загрузки первого файла. На самом деле, если требуется 10 вызовов для разбиения файла на сервер с помощью вызовов WCF, обработка возвращается после 1-го вызова WCF, потому что он асинхронный без блокировки. Весь этот процесс инициируется нажатием кнопки Upload, поэтому я предполагаю, что это делается в потоке пользовательского интерфейса. Я пытался использовать AutoResetEvent, но безрезультатно; оно всегда замерзает.

Что мне нужно, так это внешний цикл для остановки обработки до тех пор, пока асинхронные вызовы 1..n в WCF внутри (через метод ProcessFile) не будут завершены и не будет загружен целый файл. Код ниже:

'FileUploadData is an Observable collection of IO.FileInfo objects
For Each FileItem In FileUploadData
   'Method internally calls WCF asynchronously and does so continually until file is completely uploaded.
   ProcessFile(FileItem)
   'NEED TO STOP HERE until file passed in above is complete.
   'Currently processing continues on because 1st call to WCF is async and processing is returned to here.
Next

Я не обязательно ищу здесь синхронное решение, но мне нужен какой-то метод, позволяющий загружать эти файлы в их собственный поток или загружать полностью в методе «ProcessFile» 1-й (по-прежнему вызывая WCF async) перед продолжением внешнего цикла до следующего файла, показанного выше.

Есть идеи, как это решить? Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2012

Хорошо, вы поняли это почти так же быстро, как и опубликовали этот вопрос (здорово, когда это происходит). Эта статья (http://www.informit.com/articles/article.aspx?p=1759240) помогла мне придумать немного другой способ оценить это с помощью базового метода, который я уже использовал.

Теперь я использую запрос LINQ для обработки только одного файла за раз из коллекции вместо цикла, чтобы непрерывно обрабатывать их все. Как только файл завершил загрузку, я удаляю его из коллекции и вызываю Событие, которое я объявил в end метода ProcessFile. Метод обработчика событий вызывается и выбирает следующий файл для обработки в коллекции и повторяет его до завершения.

Dim NextUpload = (From f In FileUploadData
                 Select f).FirstOrDefault

If NextUpload IsNot Nothing Then
   ProcessFile(NextUpload)
End If

Работает как шарм!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...