2013-09-03 3 views
0

Исходя из фона Java Я столкнулся с проблемой синхронизации с двухсторонним связующим механизмом. У меня есть свойство, которое привязано к selectitem в combobox.C# Two Way Binding Loop

<ComboBox SelectedItem="{Binding car.hp, Mode=TwoWay}" .../> 

В событии OnSelectionChanged я запускаю долгое время выполнения команды.

private void async() { 
    ... 
    await longtermjob(); 
    ... 
} 

Это все работает до сих пор. Но если я быстро изменю выделение списка, пока команда еще не закончена, я запускаю бесконечный цикл. Выбранный элемент продолжает меняться между двумя значениями. Любые идеи, как это может произойти? Как я могу убедиться, что привязка является потокобезопасной?

ответ

3

Если вы измените значение связанного свойства в событии без условия останова, изменение данных будет продолжать вызывать OnSelectionChanged в зависимости от того, как вы изменяете данные. Если вы добавите логический флаг, который проверяет, продолжается ли асинхронный вызов, вы не должны сталкиваться с этой проблемой. Кроме того, я также предлагаю вам временно отключить управление.

Редактировать/вот решение:

private bool requestInProcess { get; set; } 

private void async() { 
    if (!requestInProcess) { 
     requestInProcess = true; 
     await longtermjob(); 
     requestInProcess = false; 
    } 
} 
+0

Он может обновить логический флаг, используя функцию обратного вызова после того, как текущий поток закончить задачу. –

+0

Это то, что происходит с 'await', но это позволяет запускать несколько запросов и запускать их, что вызывает больше .... – WiredPrairie

+0

Спасибо! Добавление условия устраняет проблему! – Sonic