Dispatcher.DisableProcessing - InvalidOperationException

Проучвам Dispatcher.DisableProcessing() като средство за поставяне на пауза и възобновяване на изобразяването на потребителския интерфейс и се опитвам да го използвам без оператора using(){}.

Той хвърля InvalidOperationException - обработката на диспечера е спряна, но съобщенията все още се обработват.

Въпрос: Защо се хвърля това изключение? Има ли някакъв начин да го използвам извън оператора 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);
    }

Тук

Според stacktrace тази функция се извиква от Application.RunInternal. Приложението изпрати работа в диспечера, който не можа да го направи, защото беше деактивиран. Предполагам, че тази работа е ефектът от натискането на бутона и след това светещият ефект, когато бутонът е фокусиран, но не мога да съм сигурен.

person nkoniishvt    schedule 19.12.2014