Dispatcher.DisableProcessing — исключение InvalidOperationException

Я исследую Dispatcher.DisableProcessing() как средство для приостановки и возобновления рендеринга пользовательского интерфейса, и я пытаюсь использовать его без оператора using(){}.

Выдает InvalidOperationException — обработка Dispatcher была приостановлена, но сообщения все еще обрабатываются.

Вопрос: Почему выбрасывается это исключение? Есть ли способ использовать его вне инструкции using () {}?

Заранее спасибо!

-Отредактировано для включения тестового кода-

Рабочий процесс:

Это исключение по-прежнему возникает после успешного выполнения кода OnPauseButtonClick.

public class MainWindow: Window
{
    public MainWindow()
    {
        Initialize();
    }

    private DispatcherProcessingDisabled x;

    public void OnPauseButtonClick(object sender, RoutedEventArgs e)
    {
        x = Dispatcher.DisableProcessing();
    }

    public void OnTestButtonClick(object sender, RoutedEventArgs e)
    {
        Timer t = new Timer(TimerCallback, null, 0, 1000);
    }

    public void TimerCallback(object o)
    {
        //all codes were commented out
    }
}

person na9090    schedule 18.12.2014    source источник


Ответы (1)


Итак, я нашел, где Dispatcher выдает исключение.

    [UIPermissionAttribute(SecurityAction.LinkDemand,Unrestricted=true)]
    [SecurityCritical]
    public static void PushFrame(DispatcherFrame frame)
    {
        if(frame == null)
        {
            throw new ArgumentNullException("frame");
        }

        Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
        if(dispatcher._hasShutdownFinished) // Dispatcher thread - no lock needed for read
        {
            throw new InvalidOperationException(SR.Get(SRID.DispatcherHasShutdown));
        }

        if(frame.Dispatcher != dispatcher)
        {
            throw new InvalidOperationException(SR.Get(SRID.MismatchedDispatchers));
        }
        //here
        if(dispatcher._disableProcessingCount > 0) 
        {
            throw new InvalidOperationException(SR.Get(SRID.DispatcherProcessingDisabled));
        }

        dispatcher.PushFrameImpl(frame);
    }

здесь

Судя по трассировке стека, эта функция вызывается Application.RunInternal. Приложение отправило работу в Диспетчер, который не мог этого сделать, потому что был отключен. Я предполагаю, что эта работа - эффект нажатия на кнопку, а затем светящийся эффект, когда кнопка сфокусирована, но я не могу быть уверен.

person nkoniishvt    schedule 19.12.2014