Как определить текущий DispatcherPriority из метода который выполняет Dispatcher?

308
09 декабря 2016, 08:52

Как определить текущий DispatcherPriority из метода который выполняет Dispatcher? Если я запускаю какой–то метод через Dispatcher с приоритетом (для примера) Input, то как узнать из самого метода, с каким приоритетом он выполняется?

Answer 1

В принципе можно, хотя я не вполне понимаю, зачем это вам.

Вот такой класс у меня работает:

class DispatcherSpy : IDisposable
{
    public DispatcherSpy(Dispatcher dispatcher)
    {
        this.dispatcher = dispatcher;
        dispatcher.Hooks.OperationCompleted += OnOperationCompletion;
        dispatcher.Hooks.OperationStarted += OnOperationStart;
    }
    public DispatcherPriority? CurrentOperationPriority { get; private set; }
    void OnOperationStart(object sender, DispatcherHookEventArgs e) =>
        CurrentOperationPriority = e.Operation.Priority;
    void OnOperationCompletion(object sender, DispatcherHookEventArgs e) =>
        CurrentOperationPriority = null;
    public void Dispose()
    {
        dispatcher.Hooks.OperationStarted -= OnOperationStart;
        dispatcher.Hooks.OperationCompleted -= OnOperationCompletion;
    }
    readonly Dispatcher dispatcher;
}

Пользоваться так:

public partial class MainWindow : Window
{
    DispatcherSpy spy;
    public MainWindow()
    {
        InitializeComponent();
        Loaded += (o, args) =>
            {
                spy = new DispatcherSpy(this.Dispatcher);
                this.Dispatcher.InvokeAsync(Callback, DispatcherPriority.Input);
            };
        Unloaded += (o, args) => spy.Dispose();
    }
    void Callback()
    {
        var priority = spy.CurrentOperationPriority;
        Console.WriteLine(priority);
    }
}

DispatcherSpy должен быть запущен до старта метода, который будет запрашивать своё состояние.

READ ALSO
DataTableAdapter Report Viewer C# WinForms

DataTableAdapter Report Viewer C# WinForms

После компиляции приложения, не работает отчет в reportViewer если рядом с файломexe не лежит XML файл, в котором при компиляции прописывается сервер,...

293
Передача сообщений между потоками - C#

Передача сообщений между потоками - C#

Есть у меня простой класс-логгер:

753
Поиск элемента по имени в WinForms

Поиск элемента по имени в WinForms

Мне надо на форме именно найти элемент (button, panel и тд

643
Реализация ввода десятичных цифр

Реализация ввода десятичных цифр

Всем доброго! Народ помогите новичку никак не могу решить вопрос вводы десятичных цифрКак это делать правильно

279