2016-04-27 4 views
2

У меня есть функция вызывается из потока пользовательского интерфейса, я дважды проверить, если это так, поWPF ждут ключи от потока пользовательского интерфейса

System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread) 

все вызывается из метода void, который не может быть async void потому что он имеет параметр out (метод от стороннего API).

Таким образом, в этом методе void я делаю вызов к async методе, основной метод не должен ждать, так что я просто запустить его и забыть (планирование обработки исключений в методе ContinueWith, но я не там еще).

Проблема заключается в том, что когда в цепи методы await выполняется на ExecuteTaskAsync методе клиента RestSharp, после этой строки, нить Witched к МТУ, то SynchronizationContext.Current отличается тоже.

Почему это происходит? Должно ли ключевое слово await вернуться к оригинальному SynchronizationContext? Почему во время этого звонка меняется SynchronizationContext.Current?

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

ответ

1

Ok, решить ее, упомянутый void метод от 3 партии API, бегал с потоком, который имеет диспетчер, потому что

System.Windows.Threading.Dispatcher.FromThread(System.Threading.Thread.CurrentThread) 

Возвращается диспетчер, я не знаю, почему, но не имеет значения, я должен был запустить мой метод асинхронной в качестве Invoke как

Application.Current.Dispatcher.Invoke(() => myAsyncMethod()); 

, а затем в await в моем методе не переключил SynchronizationContext. Похоже мое предположение, что когда есть диспетчер, это неправильный контекст, не знаю почему :)

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