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.