Диспетчерские и рабочие темы - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть вопрос о диспетчерах и фоновых рабочих потоках. У меня есть система, в которой я асинхронно обрабатываю HTTP-запросы. В конце концов ObservableCollection привязывается к элементу управления WPF.

Я использовал Dispatcher.CurrentDispatcher.CheckAccess () вместо Deployment.Current.Dispatcher.CheckAccess () Silverlight, чтобы определить, нахожусь ли я в потоке пользовательского интерфейса или нет. Однако, глядя на документацию и другие вопросы здесь о переполнении стека, кажется, что версия WPF просто создает диспетчер, если требуется.

Текущая система использует CheckAccess в потоке планирования, чтобы определить, находимся ли мы в потоке пользовательского интерфейса, и затем передает его обработчику, который выполняется в рабочем потоке. CheckAccess в рабочем потоке также возвращает true, предположительно потому, что он только что создал свой собственный диспетчер.

Перемещение в наблюдаемую коллекцию с перекрестным потоком не вариант. Другой вопрос сказал, что мне нужно сохранить ссылку на диспетчер потока пользовательского интерфейса. Есть ли способ использовать класс Dispatcher / другие классы в пространстве имен Threading, чтобы определить, нахожусь ли я в потоке пользовательского интерфейса? Или я должен пойти дальше и использовать диспетчер потока планирования для запуска обработчика независимо от того, был ли поток планирования потоком пользовательского интерфейса или нет?

Спасибо!

1 Ответ

2 голосов
/ 13 апреля 2011

Я использую Dispatcher.CurrentDispatcher

Это просто связывает Dispatcher с вызывающим (текущим) потоком, и если он не существует, он будет создан. Итак, как вы обнаружили, вызов CheckAccess () для этого диспетчера вернет true .

Вы можете попробовать использовать Application.Current.Dispatcher, мои наблюдения показывают, что это диспетчер, связанный с основным потоком пользовательского интерфейса, хотя я не могу точно сказать, является ли это всегда случаем. Вы также должны иметь в виду, что это может не сработать, если у вас более одного потока пользовательского интерфейса, вы не будете знать, какой поток владеет элементом пользовательского интерфейса, который связан с вашей ObservableCollection. В этом случае вам нужно будет начать передавать ссылку на соответствующий Диспетчер (или SynchronizationContext ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...