У меня есть окно WPF, которое создает и запускает таймер в своем конструкторе. Событие истечения таймера запускает метод (SyncPTUpdate), который использует BeginInvoke для вызова другого метода (PTProgressUpdateInThread) в потоке окна. Затем это вызывает вызов WCF асинхронно (с использованием шаблона TAP, автоматически сгенерированного VS 2013).
Когда я искусственно увеличиваю продолжительность вызова WCF (используя thread.sleep в серверном компоненте), пользовательский интерфейс моего приложения WPF зависает. Не сразу, а через несколько секунд.
Где я ошибаюсь?
public delegate void PTProgressDelegate();
// this method is called from a periodically firing timer (System.Timers)
private async void SyncPTUpdate(object sender, ElapsedEventArgs e)
{
await this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new PTProgressDelegate(PTProgressUpdateInThread));
}
private async void PTProgressUpdateInThread()
{
PTMapFieldClient = new FieldClient();
ServiceField.BlokPTProgress PTProgressFromServer = await PTMapFieldClient.GetPTProgressAsync(variousparametershere);
PTMapFieldClient.Close();
// now use the results of the WCF call to update the Window UI
//...
}
System.Action
. - person SLaks   schedule 05.02.2014System.Windows.Threading.DispatcherTimer
, если хотите, чтобы ваш таймер срабатывал в основном потоке. - person Sebastian Negraszus   schedule 05.02.2014// now use the results of the WCF call to update the Window UI
- person Stephen Cleary   schedule 05.02.2014Application.Current.BeginInvoke()
дляNotifyPropertChanged()
, и все ваши проблемы волшебным образом исчезнут. - person Federico Berasategui   schedule 05.02.2014Task.Delay
и создать воспроизводимый тестовый пример. - person Stephen Cleary   schedule 05.02.2014