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();