Dispatcher.Invoke 在应用程序空闲时单击按钮 - 我的 UI freeze/block
Dispatcher.Invoke on application idle on button click - does my UI freeze/block
假设您有一些例程注册为 ApplicationIdle 的 BeginInvoke,例如
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)OffLoadWork);
现在在某些情况下需要在 UI 中执行操作时执行此 OffLoadWork,例如在单击按钮时,我调用
是否安全
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.ApplicationIdle, (Func<object>)(() =>
{
//do nothing just wait for the OffLoadWork to happen...
return null;
}));
或者我的 UI 是否会冻结,因为我正处于 UI 操作的中间,所以它什么时候真正空闲?
在我的第一次测试中,它似乎有效,但我只是想确保它没有办法 freeze/block。
我认为您感到困惑 DispatcherPriority.ApplicationIdle
。调用是同步的,可以阻止您的 UI。
DispatcherPriority
这里根据定义是优先级,相对于Dispatcher
事件队列中的其他未决操作,调用指定的方法。因此,如果您的操作是 Dispatcher 队列中唯一发生并在 UI 线程上触发的操作,它将阻塞它直到它不 return.
假设您有一些例程注册为 ApplicationIdle 的 BeginInvoke,例如
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)OffLoadWork);
现在在某些情况下需要在 UI 中执行操作时执行此 OffLoadWork,例如在单击按钮时,我调用
是否安全Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.ApplicationIdle, (Func<object>)(() =>
{
//do nothing just wait for the OffLoadWork to happen...
return null;
}));
或者我的 UI 是否会冻结,因为我正处于 UI 操作的中间,所以它什么时候真正空闲?
在我的第一次测试中,它似乎有效,但我只是想确保它没有办法 freeze/block。
我认为您感到困惑 DispatcherPriority.ApplicationIdle
。调用是同步的,可以阻止您的 UI。
DispatcherPriority
这里根据定义是优先级,相对于Dispatcher
事件队列中的其他未决操作,调用指定的方法。因此,如果您的操作是 Dispatcher 队列中唯一发生并在 UI 线程上触发的操作,它将阻塞它直到它不 return.