3 回答
TA贡献1790条经验 获得超9个赞
尝试 或 代替 。await Task.Delay(10);
await Dispatcher.BeginInvoke(new Action(() => { }), System.Windows.Threading.DispatcherPriority.Input);
Dispatcher.Yield
这应该使 UI 线程有机会在执行循环时进行呈现。
TA贡献1827条经验 获得超7个赞
或者无论你在哪个线程上运行,都有效的奇怪的怪物:
await Task.Run(() =>
{
Action action = () => { };
MainWindow.Dispatcher.Invoke(action,
System.Windows.Threading.DispatcherPriority.Background);
});
Dispatcher.Yield()在 UI 线程上工作正常。但它是一个静态方法,在 上运行,并且没有等效的非静态成员。Dispatcher.CurrentDispatcher
TA贡献2037条经验 获得超6个赞
如果我增加调度程序优先级以进行渲染,则该方法不会再卡住,但 UI 不会更新,输入也不会再得到处理。
实际上,问题在于您在错误的方向上更改了优先级。将优先级设置为 将允许 WPF 完成其工作,然后最终安排继续以允许方法在 之后继续执行。DispatcherPriority.Backgroundawait
即:
public async Task DoStuff(CancellationToken token)
{
do
{
DoLayoutUpdate();
await Dispatcher.Yield(DispatcherPriority.Background);
} while (!token.IsCancellationRequested);
}
使用较高的优先级会导致过早地安排继续,从而为循环提供所有调度程序时间,优先于 WPF 需要执行的所有其他操作。
当然,请注意,不带参数的调用也将默认为 using。无论哪种方式都工作正常。Dispatcher.Yield()DispatcherPriority.Background
在接受的答案中提出的其他想法也会起作用,但与简单地屈服于正确请求的延续优先级相比,它们有点笨拙。
- 3 回答
- 0 关注
- 137 浏览
添加回答
举报