WPF在异步等待模式中使用带有WCF的MVVM

时间:2017-01-06 15:46:16

标签: c# wpf wcf mvvm async-await

我正在构建一个WPF应用程序,它将MVVM与WCF后端一起用作模式。 我的用户界面必须始终具有响应性,对于某些控件,数据最多可以加载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;
        }

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

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

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

        return result;
    }

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

有人可以帮助我解决为什么我无法重复使用其他地方使用的WCF客户端对象而不是总是在异步上下文中,例如同步调用viewmodel

1 个答案:

答案 0 :(得分:0)

感谢@Rowbear,我确定了真正的问题。

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

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

谢谢!建议。