Как я могу реализовать вызовы синхронизации для служб WCF в SIlverlight? - PullRequest
2 голосов
/ 15 марта 2009

Иногда мне нужно вызвать службу WCF в Silverlight и заблокировать интерфейс, пока он не вернется. Конечно, я могу сделать это в три этапа:

  1. Настройка обработчиков и блока интерфейса пользователя
  2. Позвони в службу
  3. Разблокируйте пользовательский интерфейс, когда все будет сделано.

Однако я бы хотел добавить метод DoSomethingSync к классу обслуживания клиентов и вызывать его всякий раз, когда мне нужно.

Возможно ли это? Кто-нибудь действительно реализовал такой метод?

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

Ответы [ 4 ]

9 голосов
/ 15 марта 2009

Вот в чем суть; Вы не должны синхронизировать ввод-вывод в Silverlight. Прекратите бороться с этим! Вместо этого:

  • отключить все важные части пользовательского интерфейса
  • запуск асинхронного ввода-вывода с обратным вызовом
  • (...)
  • при обратном вызове обработайте данные и обновите / повторно включите пользовательский интерфейс

Как это происходит, я активно работаю над способами сделать асинхронный шаблон более доступным (в частности, с учетом Silverlight). Вот первый удар, но у меня в рукаве что-то получше; -p

2 голосов
/ 18 марта 2010

Вот класс, который позволит вам синхронно вызывать сервисы WCF в SL: http://johnleitch.blogspot.com/2010/03/easy-way-to-synchronously-call-wcf.html

2 голосов
/ 15 марта 2009

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

Очень простой способ синхронного осуществления служебного вызова - это использование ManualResetEvent.

ManualResetEvent m_svcMRE = new ManualResetEvent(false);
MyServiceClient m_svcProxy = new MyServiceClient(binding, address);
m_svcProxy.DoSomethingCompleted += (sender, args) => {  m_svcMRE.Set(); };

public void DoSomething()
{
    m_svcMRE.Reset();
    m_svcProxy.DoSomething();
    m_svcMRE.WaitOne();
}
0 голосов
/ 03 февраля 2011

Использование SL4 для построения бизнес-приложений само по себе является неправильным подходом. Я сталкиваюсь с проблемой асинхронного вызова в клиенте SL4. Не только этот вопрос. После того, как вы перейдете на работу в течение 15 минут после входа в приложение SL, после перерыва приложение SL не сможет полностью сохранить все данные. Это случается иногда очень часто.

...