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

时间:2009-03-15 08:30:54

标签: c# silverlight wcf synchronous

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

  1. 设置处理程序和阻止用户界面
  2. 致电服务
  3. 完成所有操作后取消阻止用户界面。
  4. 但是,我想将DoSomethingSync方法添加到服务客户端类,只需在需要时调用它。

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

    更新 看起来答案根本不是使用同步调用。将为异步调用寻找一些易于使用的模式。请查看this帖子(摘自评论)以获取更多信息。

4 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:2)

我不同意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();
}

答案 2 :(得分:2)

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

答案 3 :(得分:-1)

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