【问题标题】:WPF application freezes on first WCF callWPF 应用程序在第一次 WCF 调用时冻结
【发布时间】:2011-07-14 13:20:09
【问题描述】:

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

【问题讨论】:

    标签: wpf wcf service


    【解决方案1】:

    听起来您需要异步进行调用。要么在新线程上启动调用(最好使用Task),要么使用asynchronous design pattern 调用WCF 服务。

    【讨论】:

      【解决方案2】:

      将 WCF 调用放在后台线程中

      【讨论】:

        【解决方案3】:

        在执行 WCF 服务调用时,有两个原因会导致某些东西“冻结”:

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

        【讨论】:

          【解决方案4】:

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

          如果您不需要此服务方法的返回值,您可以在您的服务上使用 [OperationContract(IsOneWay=true)]。这样您就不必担心线程和其他东西。

          【讨论】:

            【解决方案5】:

            您在主线程上调用 WCF 调用,因此它看起来会崩溃。

            • 您可以将其放入一个线程中,然后在应用程序开始时调用它。 将其置于后台进程中(如果您在 Visual Studio 中,可以将其拖出工具栏)

            您可以通过定义一个 Thread,然后定义一个 threadstart,传入您的登录 WCF 调用,以及调用 thread.start() 来非常轻松地创建线程;并传入您定义的 threadstart。

            后台工作人员非常相似,您可以将代码放在 backgroundWorker1_DoWork() 方法中

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

            试试这个线程进行异步 WCF 调用

            How to make a call to my WCF service asynchronous?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-04-30
              • 1970-01-01
              • 1970-01-01
              • 2012-10-04
              • 1970-01-01
              • 1970-01-01
              • 2011-11-07
              相关资源
              最近更新 更多