Как я могу определить, активен ли Dispatcher.DisableProcessing? - PullRequest
10 голосов
/ 23 октября 2009

Возникает исключение, если кто-то пытается показать окно сообщения, если Dispatcher приостановлен (Dispatcher.DisableProcessing() вызван).

InvalidOperationException: 'Обработка диспетчера приостановлена' (см. здесь ).

Кто-нибудь знает, как я могу определить, где Dispatcher приостановлен или нет (поэтому я знаю, когда звонить BeginInvoke())?

Редактировать 1:

В ответ на событие Application.DispatcherUnhandledException я пытаюсь показать MessageBox. Однако, если это необработанное исключение было выдано во время привязки данных (т. Е. ItemsControl.ItemsSource), Dispatcher приостанавливается. Попытка показать MessageBox не удалась. Всегда использование Dispatcher.BeginInvoke() решает проблему, но я не хочу этого делать, если это действительно необходимо.

Редактировать 2:

Использование Reflection для выполнения этой работы выглядит так:

var dispatcherType = typeof(Dispatcher);
var countField = dispatcherType.GetField("_disableProcessingCount", BindingFlags.Instance | BindingFlags.NonPublic);
var count = (int)countField.GetValue(Dispatcher.CurrentDispatcher);
var suspended = count > 0;

Ответы [ 2 ]

0 голосов
/ 19 марта 2013

попробуйте это:

if(currentDispatcher.Thread.ThreadState == System.Threading.ThreadState.Suspended)
{

}
0 голосов
/ 23 октября 2009

Там нет общедоступного интерфейса, поэтому у вас нет законного способа сказать, приостановлен он или нет. Вы все еще можете использовать рефлексию, но в целом это говорит о том, что вы делаете что-то совершенно неправильно.

Если бы вы могли дать нам более подробную информацию, мы могли бы предложить правильное решение?

...