WCF Async Calls Опрос или пометка - лучшая практика - PullRequest
0 голосов
/ 29 июля 2010

Я работаю над этим проектом Silverlight 3.0, который полностью заполнен асинхронными вызовами веб-службы. На главной странице он выбирает некоторые необходимые данные для правильной работы приложения, используя 3 асинхронных вызова. В настоящее время приложение не отключает какие-либо элементы управления при выполнении этих вызовов, что означает, что пользователь может взаимодействовать с ним без необходимых данных. Мне нужно отключить всю сетку и только после того, как все 3 асинхронных вызова будут завершены, и только после этого включить сетку.

Как лучше всего это делать?

Это мои звонки:

client.GetAllAsync();
client.GetAllCompleted += new EventHandler<GetAllCompletedEventArgs>(client_GetAllCompleted);

client.GetActualAsync();
client.GetActualCompleted += new EventHandler<GetActualCompletedEventArgs>(client_GetActualCompleted);

client.GetSomeAsync();
client.GetSomeCompleted += new EventHandler<GetSomeCompletedEventArgs>(client_GetSomeCompleted);

Ответы [ 2 ]

2 голосов
/ 29 июля 2010

Кажется, много работы только для того, чтобы поставить в очередь интерактивность пользователя.

Обычно я предоставляю интерфейс для всего приложения:

public interface IAppGlobalState 
{
   void BeginAsync(); 
   void EndAsync(); 
}

В реализации я сделаю это:

public partial class MainShell : UserControl, IAppGlobalState 
{
   private int _queue; 
   private object _mutex = new Object();

   public void BeginASync()
   {
      Monitor.Enter(_mutex);
      if (_queue++ == 0)
      {
         VisualStateManager.GoToState(this, "BusyState", true);
      }
      Monitor.Exit(_mutex);
   }

   public void EndAsync()
   {
      Monitor.Enter(_mutex);
      if (--_queue == 0)
      {
         VisualStateManager.GoToState(this, "IdleState", true); 
      }
      Monitor.Exit(_mutex);
   }
}

Конечно, если у вас много-потом тогда вы будете использовать Interlocked на тех, но большую часть времени вы будете вызывать его из того же потока.Затем вы просто делаете:

GlobalState.BeginAsync();
client.FirstAsyncCall();

GlobalState.BeginAsync();
client.FirstAsyncCall();

А затем при возврате просто:

GlobalState.EndAsync();

Если у вас есть вложенные вызовы, нет проблем, этот метод их раскручивает.

0 голосов
/ 29 июля 2010
  1. Создание единицы рабочего элемента в вашем серебряном свете
  2. Это UOW вызывает событие по завершении
  3. Свяжите это событие с вашим кодом GUI
  4. Используйте сигнализацию илипростой счетчик в вашей единице работы, чтобы вызвать событие «готово».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...