如何在SIlverlight中实现对WCF服务的同步调用?

有时我需要在Silverlight中调用WCF服务并阻止UI直到它返回。 当然,我可以分三步完成:

  1. 设置处理程序和阻止UI
  2. 致电服务
  3. 一切都完成后取消阻止UI。

但是,我想将DoSomethingSync方法添加到服务客户端类,只需在需要时调用它。

可能吗? 有没有人真正实现过这样的方法?

更新:看起来答案根本不是使用同步调用。 将为异步调用寻找一些易于使用的模式。 看一下这篇文章(摘自评论)。

这就是重点; 你不应该在Silverlight中同步IO。 停止战斗吧! 代替:

  • 禁用UI的任何关键部分
  • 使用回调启动异步IO
  • (……)
  • 在回调中,处理数据并更新/重新启用UI

碰巧的是,我正在积极研究如何使异步模式更加平易近人(特别是考虑到Silverlight)。 这是第一次刺伤,但我的袖子更好了;-p

我不同意Marc有真正需要进行同步Web服务调用的情况。 但是你应该避免的是在UI线程上阻塞,因为这会产生非常糟糕的用户体验。

同步实现服务调用的一种非常简单的方法是使用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(); } 

这是一个允许您在SL中同步调用WCF服务的类: http : //johnleitch.blogspot.com/2010/03/easy-way-to-synchronously-call-wcf.html

使用SL4构建业务应用程序本身是错误的方法。 我在SL4客户端遇到异步调用问题。 不仅是这个问题。 一旦你在登录SL应用程序后去了15分钟的beeak,rest后你的SL应用程序根本无法保留所有数据。 它有时经常发生。