我有一个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;
}
答案 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线程中完成任务。
我希望这对你有所帮助。