c# - 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 中。推测线程被阻塞等待输入或渲染任务。
如果我增加DispatcherPriority
to Render
,该方法不会再卡住,但 UI 不会更新并且输入不再处理。
我怎样才能解决这个问题?
解决方案
尝试await Task.Delay(10);
或await Dispatcher.BeginInvoke(new Action(() => { }), System.Windows.Threading.DispatcherPriority.Input);
代替Dispatcher.Yield
.
这应该让 UI 线程有机会在循环执行时进行渲染。
推荐阅读
- makefile - 通过 Makefile 和 `dpkg-buildpackage -us -uc` 进行 Eiffel 编译产生错误
- python - 即使数据看起来不错,也无法读取 CSV 文件
- c++ - C++ SFML 屏幕边界碰撞
- java - JPA @Query 与 Entity like 参数
- swift - GCDAsyncUdpSocket 套接字在发送 255 个数据包之间关闭
- css - 将最后两个弹性项目放置在容器的末尾
- scala - Apache Flink 流中是否有可用的比较选项?
- events - Netsuite文件柜中新文件的触发事件
- r - 将 R 中的数据集拆分为 3 个子集:低 25%、中 50% 和前 25%
- zapier - 从 Zapier 存储中获取所有数据