2017-01-06 3 views
4

Я создаю приложение WPF, которое использует MVVM как шаблон вместе с бэкэнд WCF. Мой пользовательский интерфейс должен всегда быть отзывчивым, а для некоторых элементов управления данные могут быть загружены до 10 секунд.WPF с использованием MVVM с WCF в шаблоне ожидания async

После кода работает хорошо и в моей ViewModel где ConfigurationsForInterface является Наблюдаемые типа, который связан с моим контролем:

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 потоке и вызывает у меня интерфейс заморозить до загрузки данных. Из моей отладки видно, что он не ждет в самом методе.

Может кто-то помочь мне, почему я не могу повторно использовать свой объект клиента WCF, который используется в другом месте и не всегда в контексте асинхронной как только синхронизировать называя ViewModel

+1

Можете ли вы показать, как этот метод используется? – Fabio

+1

Просто совет: никогда не используйте WCF-клиент в глобальном контексте. Его просто просят утечку памяти из соединений, которые не закрываются должным образом. –

+1

oh, а также клиенты WCF не являются потокобезопасными, поэтому одновременное выполнение нескольких вызовов с одним и тем же клиентом, вероятно, вызовет вас для цикла –

ответ

0

Благодаря @Rowbear я подсказала реальную проблему.

Я изменил привязку с WsHttpBinding на NetTCPBinding, а затем все работает красиво асинхронно. Для моего приложения я могу легко использовать NetTCPBinding.

Кажется, что-то все еще идет синхронизация. в реализации WsHttpBinding.

Спасибо! за советом.

Смежные вопросы