WPF 在异步等待模式中使用 MVVM 和 WCF

Posted

技术标签:

【中文标题】WPF 在异步等待模式中使用 MVVM 和 WCF【英文标题】:WPF using MVVM with WCF in a async await pattern 【发布时间】:2017-05-21 10:04:18 【问题描述】:

我正在构建一个 WPF 应用程序,它使用 MVVM 作为模式以及 WCF 后端。 我的 UI 必须始终响应,并且对于某些控件,加载数据最多可能需要 10 秒。

以下代码运行良好,位于我的视图模型中,其中 ConfigurationsForInterface 是绑定到我的控件的 Observable 类型:

ConfigurationsForInterface = new ObservableCollection<string>()  "Loading..." ;      
ConfigurationsForInterface = await GetConfigurationInterfaceXAsync();

工作正常的方法:

      public async Task<ObservableCollection<string>> GetConfigurationHL7Server5Async()
        
            ObservableCollection<string> result;

            using (var localClient = new ManagerListenerClient(Globals.ChannelBinding, Globals.EndpointAddress))
                           
                result = await  localClient.GetConfigurationsAsync("interfacex");
            

            return result;
        

冻结我的 UI 的方法,因为我在为服务(用户)设置上下文时重用已在应用程序的其他区域打开的服务客户端:

  public async Task<ObservableCollection<string>> GetConfigurationHL7Server5Async()
    
        ObservableCollection<string> result;

        result = await Globals.Client.GetConfigurationsAsync("interfacex"); 

        return result;
    

WCF 客户端似乎以某种方式绑定到我的 UI 线程并导致我的 UI 冻结,直到加载数据。从我的调试中可以看出,它并没有在方法本身中等待。

谁能帮我解释为什么我不能重用我在其他地方使用的 WCF 客户端对象,而不是总是在异步上下文中,比如同步调用视图模型

【问题讨论】:

你能说明这个方法是怎么用的吗? 提示:永远不要在全局上下文中使用 WCF 客户端。它只是要求未正确关闭的连接导致内存泄漏。 哦,另外,WCF 客户端不是线程安全的,因此同时使用同一个客户端进行多次调用可能会让您陷入循环 嗨 Mike,wcf 服务是基于会话的。因此,当打开客户端时,我为服务器上的会话设置了一个状态(例如,当用户进行身份验证时,结果将根据用户的 priv. 级别而有所不同)。在客户端打开的整个过程中,此会话都会保持此状态。这工作得很好。如果我遵循您的建议,这意味着对于每个异步调用,我都需要在会话上设置我的状态以设置服务返回的用户权限级别......我想不惜一切代价避免这种情况。 我想知道这是否与 Stephen Cleary 在此处的回答有关:***.com/a/29715989/3063835 关于 .net 框架中 http 连接中的错误。我知道你说过你尝试过 Task.Factory.StartNew,但我不确定你把它放在了哪个级别。如果你将整个客户端调用包装在一个新任务中怎么办? 【参考方案1】:

感谢@Rowbear,我找到了真正的问题。

我将绑定从 WsHttpBinding 更改为 NetTCPBinding,然后一切都很好地异步运行。对于我的应用,我可以轻松使用 NetTCPBinding。

似乎有些东西仍在同步。在 WsHttpBinding 实现中。

谢谢!征求意见。

【讨论】:

以上是关于WPF 在异步等待模式中使用 MVVM 和 WCF的主要内容,如果未能解决你的问题,请参考以下文章

有关使用 WCF 服务的 MVVM 模式的一般问题

在 WPF 智能客户端应用程序中使用 WCF DTO 时理解 MVVM 使用的问题

在不触发 OnPropertyChanged 的​​情况下更新 WPF DataGrid

WPF MVVM WCF 客户端/服务器架构

WCF , WPF,MVC,有啥不同

WCF , WPF,MVC,有啥不同