Yield 这个词很有意思,叫做“屈服”“放弃”“让步”,字面意义上是让出当前任务的执行权,转而让其他任务可以插入执行。Task、Dispatcher、Thread 都有 Yield() 方法,看起来都可以让出当前任务的执行权。
如果在阅读中发现对本文涉及到的一些概念不太明白,可以阅读:
Dispatcher.Yield
如果一个方法的实现比较耗时,为了不影响 UI 的响应,你会选择用什么方法呢?我之前介绍过的 Invoke 和 InvokeAsync 可以解决,将后续耗时的任务分割成一个个小的片段以低于用户输入和渲染的优先级执行。
Dispatcher.Yield 也可以,其行为更加类似于 Dispatcher.InvokeAsync(即采用 Dispatcher 调度的方式,事实上后面会说到其实就是调用了 InvokeAsync),而非 Dispatcher.Invoke(即采用 PushFrame 新开消息循环的方式)。
使用时需要 await:
foreach(var item in collection)
{
DoWorkWhichWillTakeHalfASecond();
await Dispatcher.Yield();
}
这样,这个 foreach

本文探讨了在WPF中出让执行权的两种方法:Dispatcher.Yield和Task.Yield。Dispatcher.Yield允许UI线程在执行耗时操作时响应用户交互,而Task.Yield则在任何线程上提供类似的功能。两者的调度方式和优先级处理有所不同,Dispatcher.Yield更注重UI优先级,而Task.Yield适用于多线程场景。
最低0.47元/天 解锁文章
8万+

被折叠的 条评论
为什么被折叠?



