WPF使用MVVM模式与WCF在异步等待模式下的应用

5

我正在构建一个使用MVVM模式与WCF后端一起的WPF应用程序。 我的UI必须始终响应,并且对于某些控件,数据加载时间可能长达10秒。

下面的代码有效,并且位于我的viewmodel中,其中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被冻结的方法:当我为服务设置上下文(用户)并重复使用已在应用程序其他区域打开的服务客户端时,会导致UI被冻结。

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

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

        return result;
    }
似乎WCF客户端与我的UI线程绑定,导致UI在数据加载完成前冻结。我可以从调试中看到它并没有在方法本身等待。
有人能帮我解决为什么我不能重用我的WCF客户端对象吗?该对象已在其他地方使用,并不总是在异步上下文中,如只是同步调用视图模型。

1
您能演示一下如何使用这个方法吗? - Fabio
1
只是一个小建议:永远不要在全局上下文中使用WCF客户端。这只会导致连接没有正确关闭而引起内存泄漏。 - Mike_G
1
哦,还有,WCF客户端不是线程安全的,因此同时使用同一客户端进行多个调用可能会使您陷入困境。 - Mike_G
代理并不过时...我也尝试了使用ConfigureAwait(false),但是没有成功。 - Céderic Missinne
1
我想知道这是否与Stephen Cleary在此处的回答有关:http://stackoverflow.com/a/29715989/3063835,涉及到.NET框架中http连接的错误。我知道你说过你尝试了Task.Factory.StartNew,但我不确定你在哪个级别上放置了它。如果你将整个客户端调用都包装在一个新任务中呢? - Rowbear
显示剩余10条评论
1个回答

0

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

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

似乎在 WsHttpBinding 实现中仍然有一些同步问题。

感谢您的建议!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接