AddTimeout 或 AddIdle 用于 GTK 主线程上的 UI 更新?

AddTimeout or AddIdle for UI updates on GTK main thread?

当使用 GTK# (GDK2) 进行 UI 更新时,例如更改标签文本、设置按钮可见性等,作为一般规则,我应该使用 Gdk.Threads.AddTimeout 还是 Gdk.Threads.AddIdle

The GDK2 documentation 表示 AddIdle

Adds a function to be called whenever there are no higher priority events pending.

因此 AddTimeout 似乎会提供响应更快的更新。但是文档指出:

Note that timeout functions may be delayed, due to the processing of other event sources. Thus they should not be relied on for precise timing.

这让我相信 Idle 和 Timeout 彼此的响应速度差不多(当 运行 代码时,它们似乎是这样)。

我正在处理的一些代码中的评论表明超时会导致更快的更新,但更难达到 UI,但我找不到任何来源来支持这一点。

那么作为一般规则,我应该使用这些方法中的哪些来在主线程中执行 GTK 更新?

Threads.AddTimeout(0, 0, () =>
    {
         // do something;
         return false;
    });

Threads.AddIdle(0, () =>
    {
        // do something;
        return false;
    });

如果您需要在特定时间段后发生某些事情,超时回调是合适的。这方面的一个例子是在文本字段中闪烁光标(不是说你应该自己实现)。

一旦主循环完成执行所有其他准备就绪的内容,就会调用空闲超时。只调用一次的区别在于优先级。如果主循环正在处理其他事件,则在空闲处理程序中执行此操作可确保其他事情先发生。

当您 return 为 true 并获得重复回调时,差异会变得更加明显。如果您在空闲回调中执行此操作,您最终会使用 OS 所允许的尽可能多的 CPU,但是假设每个回调都很快,您的 UI 仍然会保持响应。如果你在超时的情况下执行此操作,你会得到更可预测的行为。

我认为这更难 UI 的唯一原因是它默认具有更高的优先级,并且可能会延迟绘制事件。优先级 DEFAULT_IDLE < HIGH_IDLE(绘制)< 默认值。