2009-03-15 3 views
2

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

  1. Установка обработчиков и блок интерфейса
  2. Вызов службы
  3. Разблокировать UI, когда все сделано.

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

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

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

+0

На ваш вопрос: http://petesbloggerama.blogspot.com/2008/07/omg-silverlight-asynchronous-is-evil.html –

+0

Принят ли ответ на этот вопрос, действительно ответил на заданный вами вопрос? –

+0

Он указал мне, чтобы сделать это правильно, т. Е. Принять асинхронный шаблон и жить с ним. Итак - да, да. –

ответ

9

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

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

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

+0

Это всегда вопрос для меня - почему? Мы можем выполнять вызовы синхронизации WCF везде (WinForms, WPF и т. Д.), И мы можем столкнуться с такими же проблемами. Чем же отличается Silverlight? –

+0

(ответил как комментарий к вашему вопросу) –

2

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

Очень простой способ синхронного вызова службы - использовать 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

Если вы запустите DoSomething в основном потоке, ваше приложение будет висеть. – user76035

+0

Правильно, и поэтому я упомянул, что вы не должны запускать его в своем основном потоке пользовательского интерфейса. – sipwiz

+0

Пытался реализовать его, но он никогда не работал :( –

-1

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

+1

У меня такое чувство, скорее всего, проблема вызвана вашим кодом, а не Silverlight. – Stimul8d