我的应用程序中的所有内容都像我想要的那样工作,但我真的不明白究竟是怎么回事?我设置了几个线程来监控应用程序不时需要的一些资源。线程更新了几个标签,上面写着“一切都好”或“呃哦”(不是真的,但你明白了)。我设置了InvokeRequired的测试,以确保它在创建标签的线程上执行,一切都很好。
我不明白的是......如果我正在更新标签时输入一个文本框,我不应该在我的打字中看到某种延迟,因为它在同一个帖子上或者至少必须实现一些代码,所以我可以继续打字我离开的地方?我的猜测是Invoke方法可以处理事情,所以我可以继续输入我离开的位置。
它正在工作,所以我不应该抱怨,但我不想在一个月后突然弹出一些我真的不理解的错误。
答案 0 :(得分:0)
简短的回答:没有什么可担心的。
说明:现在几乎所有的GUI系统,包括WinForms,都是单线程的,所以没有任何事情同时发生,但也考虑到大多数操作都是闪电般快速的(甚至是绘画)。
更好的解释可以解释GUI消息循环是如何工作的,但是我太懒了解释它,但我会解释你说你不理解的部分。这是您在文本框中输入时的事件序列:
Value
字符串来更新其内部状态。Invoke
或BeginInvoke
)。Invoke
代码只设置了标签的Text
属性,这个操作很快,因为它只设置了内部状态。标签,它不会导致它被直接绘制,而是(如在步骤4中),它将标签标记为“无效”,并且必须在下一个最佳机会重新绘制(参见步骤8)。所以是的, 可能存在延迟或消息周期延迟,例如,如果你的Invoke
'代码执行时间超过几毫秒。如果您在Invoke'd代码中添加Thread.Sleep(10*1000)
,则会看到。