首页 > 解决方案 > Dispatcher.Yield 优先级问题

问题描述

我想循环更新我的 WPF 应用程序中某些 UI 元素的位置。每次迭代后,应重新渲染 UI 以使更改可见。可以使用 CancellationToken 随时停止更新过程。由于取消是由用户执行的,因此 UI 必须保持对输入的响应。我写了以下方法来做到这一点:

public async Task DoStuff(CancellationToken token)
{
    do
    {
        DoLayoutUpdate();

        await Dispatcher.Yield(DispatcherPriority.Input);
    } while (!token.IsCancellationRequested);
}

这主要是可行的:每次迭代后都会重新呈现 UI,我可以单击按钮取消操作,因此输入也可以正常工作。问题是:如果没有输入且没有可重新渲染的内容,则该方法会卡在 Yield 中。推测线程被阻塞等待输入或渲染任务。

如果我增加DispatcherPriorityto Render,该方法不会再卡住,但 UI 不会更新并且输入不再处理。

我怎样才能解决这个问题?

标签: c#.netwpfdispatcher

解决方案


尝试await Task.Delay(10);await Dispatcher.BeginInvoke(new Action(() => { }), System.Windows.Threading.DispatcherPriority.Input);代替Dispatcher.Yield.

这应该让 UI 线程有机会在循环执行时进行渲染。


推荐阅读