WPF应用程序在第一次WCF调用时冻结

时间:2011-07-14 13:20:09

标签: wpf wcf service

我有WPF应用程序需要在启动时访问WCF服务(登录窗口)。每次应用程序在Windows 7上运行时,它都会在登录时冻结,直到从WCF获得响应。有没有办法以不同的方式设计这个过程?

5 个答案:

答案 0 :(得分:4)

听起来你需要异步拨打电话。在新线程上启动呼叫(最好使用Task),或使用asynchronous design pattern呼叫WCF服务。

答案 1 :(得分:2)

将WCF调用放在后台线程中

答案 2 :(得分:1)

在执行WCF服务呼叫时,有两种原因被视为“冻结”:

  1. 以同步方式调用服务将阻止您的UI线程,直到调用完成。这个错误以及为什么Silverlight禁止同步调用并强制您遵循任何类型的RPC的开始/结束异步模式 - 无论是WebRequest还是WCF层。默认情况下,在向WPF项目添加服务引用时不会生成异步方法,但您可以使用“配置服务引用”将其打开。
  2. 第二个原因不太明显。初始服务客户端实例化可能需要将近3秒 - 即使在快速计算机上也是如此。这就是为什么即使使用异步模式,也建议您尽快使用QueueWorkUserItem进行代理实例化和BeginXXX调用。

答案 3 :(得分:0)

如果您需要此服务调用的响应来启动应用程序,您可以使用后台线程来调用此服务并处理返回值。当此线程正在使用该服务时,您可以显示窗口或启动画面。

如果您不需要此服务方法的retrun值,则可以在服务上使用[OperationContract(IsOneWay = true)]。所以你不必担心线程和东西。

答案 4 :(得分:0)

您正在主线程上调用WCF调用,因此它似乎会崩溃。

  • 你也可以把它放在一个线程中并在应用程序的开头调用它。 将它放在后台进程中(如果你在visual studio中,你可以将其拖离工具栏)

你可以通过定义一个Thread,然后定义一个threadstart,传入你的登录WCF调用,以及调用thread.start();来轻松地完成线程。并传入你定义的线程启动。

后台工作者非常相似,你可以将你的代码放在backgroundWorker1_DoWork()方法中

  • 或者让你的WCF调用异步,所以它会发送登录响应,你的登录代码将调用“OnTaskCompleted”方法(你也可以把它放在一个新的线程上,但实际上没有to)

尝试使用此线程进行异步WCF调用

How to make a call to my WCF service asynchronous?

相关问题