Dispatcher Priority,DispatcherTimer,DispatcherFrame有什么用

时间:2014-02-04 07:28:58

标签: c# wpf dispatcher dispatchertimer

我有一个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 个答案:

答案 0 :(得分:1)

您不需要任何WaitFor()。为什么还要等什么呢?只需让UI线程解冻,一旦数据加载,DataGrid就会显示它们。

您发布的方法正在执行.... WaitFor机制。方法名称解释了所有内容:)

以下是更多细节:

DispatcherTimer是一个简单的哑计时器你可能已经从基本的C#中知道了一旦调用了tick方法它将直接在UI线程上执行,因此你不需要关心你是否在UI线程上。你总是:)

DispatcherTimer有一个prority意味着如果proprity设置为high,则会在interval之后立即调用tick调用方法。如果将proprity设置为Background,则在UI线程不忙时将调用tick方法。

DispatcherFrame是您所在的当前范围。每个displatcher操作都有一定范围。每个范围都处理待处理的工作项

当人们使用WinForms时,Dispatcher.PushFrame与DoEvent()相同。为了简化DoEvent,你迫使UI线程做一些事情。

总结一下,你等待在UI线程中完成任务。

我希望这对你有所帮助。