Что такое использование Dispatcher Priority, DispatcherTimer, DispatcherFrame

У меня есть функция загрузки Async DataGrid. Следовательно, мне нужно вызвать WaitFor(). Вот этот код:

WaitFor(TimeSpan.Zero, DispatcherPriority.SystemIdle);

И следующие 2 метода. Может кто-нибудь объяснить, что именно делают эти методы?

public static void WaitFor(TimeSpan time, DispatcherPriority priority)
{
    DispatcherTimer timer = new DispatcherTimer(priority);
    timer.Tick += new EventHandler(OnDispatched);
    timer.Interval = time;
    DispatcherFrame dispatcherFrame = new DispatcherFrame(false);
    timer.Tag = dispatcherFrame;
    timer.Start();
    Dispatcher.PushFrame(dispatcherFrame);
}

public static void OnDispatched(object sender, EventArgs args)
{
    DispatcherTimer timer = (DispatcherTimer)sender;
    timer.Tick -= new EventHandler(OnDispatched);
    timer.Stop();
    DispatcherFrame frame = (DispatcherFrame)timer.Tag;
    frame.Continue = false;
}

1 ответ

Решение

Вам не нужно никакого WaitFor(). Зачем чего-то ждать? Просто дайте потоку пользовательского интерфейса разморозиться, и после загрузки данных DataGrid отобразит их.

Методы, которые вы разместили, используют механизм.... WaitFor. Название метода объясняет все это:)

Вот еще несколько деталей:

DispatcherTimer - это простой тупой таймер, который вы, возможно, уже знаете из базового C#: только после вызова тикового метода он будет выполняться непосредственно в потоке пользовательского интерфейса, поэтому вам не нужно заботиться о том, находитесь ли вы в потоке пользовательского интерфейса или нет. Ты всегда такой:)

DispatcherTimer имеет значение приоритета, если для свойства установлено высокое значение, метод вызова тика будет вызван сразу после интервала. Если для свойства proprity задано значение Background, метод галочки будет вызываться, когда поток пользовательского интерфейса не занят.

DispatcherFrame - это текущая область действия, в которой вы находитесь. Каждая операция диспетчера имеет вид области действия. Каждая область обрабатывает ожидающие рабочие элементы

Dispatcher.PushFrame - это то же самое, что и DoEvent(), когда люди много использовали WinForms. Для простоты DoEvent вы заставляете поток пользовательского интерфейса что-то делать.

Подводя итог, вы ждете, что все будет сделано в потоке пользовательского интерфейса.

Я надеюсь, что это поможет вам дальше.

Другие вопросы по тегам