有时我需要在Silverlight中调用WCF服务并阻止UI直到它返回。当然,我可以分三步完成:
但是,我想将DoSomethingSync方法添加到服务客户端类,只需在需要时调用它。
有可能吗?有没有人真正实现过这样的方法?
更新 看起来答案根本不是使用同步调用。将为异步调用寻找一些易于使用的模式。请查看this帖子(摘自评论)以获取更多信息。
答案 0 :(得分:9)
这就是重点;你不应该在Silverlight中同步IO。停止战斗吧!代替:
实际上,我正在积极研究如何使异步模式更加平易近人(特别是考虑到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应用程序根本无法保留所有数据。它有时经常发生。