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的主要内容,如果未能解决你的问题,请参考以下文章
在 WPF 智能客户端应用程序中使用 WCF DTO 时理解 MVVM 使用的问题