Как пользоваться диспетчером - PullRequest
1 голос
/ 15 сентября 2011

как использовать dispatcher.BeginInvoke в цикле for (httpwebrequest). С каждым диспетчера.BeginInvoke завершите работу перед вызовом другого dispatcher.BeginInvoke. Поскольку объекты, возвращаемые по httpwerequest, находятся в неправильном положении.

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Нет, BeginInvoke асинхронный - вы в основном добавляете делегатов в очередь элементов, которые будут выполняться в потоке пользовательского интерфейса.

Если вам нужно дождаться выполнения делегата, прежде чем продолжить работу в фоновом потоке, вам придется немного поработать самостоятельно, поскольку Silverlight не поддерживает синхронный метод Dispatcher.Invoke или DispatcherOperation.Wait() метод. Silverlight старается избегать синхронных подходов, подобных этому - если вы можете изменить код так, чтобы вам не приходилось ждать, это было бы предпочтительнее.

0 голосов
/ 15 сентября 2011

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

Вот пример кода, который имеетописание того, что вы описываете в своем вопросе: -

IEnumerable<AsyncOperation> LoadSomeStuff(IList<string> urls)
{
    for (string url in urls)
    {
         yield return AsyncOperationService.SwitchToBackgroundThread();
         WebRequest req = WebRequest.Create(url);
         WebResponse resp = null;
         yield return req.GetResponseAsyncOp(r => resp = r);
         using (resp)
         {
             // Do stuff with the Web Response such as construct model class instances from a stream.
         }

         // When ready to actually start touching the UI

         yield return AsyncOperationService.SwitchToUIThread();

         // Do stuff to the UI

    }

}

использование:

List<string> urls = new List<string> {"pinkElephants.xml", "whileElephants.xml"}
LoadSomeStuff(urls).Run(err =>
{
     if (err == null)
     {
          // Cool, it all worked and I probably don't need to do anything
     }
     else
     {
          // Something bad happened, lets tell the user about it in the UI somehow.
     }

});

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

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