线程在WinForm中

时间:2013-04-19 19:16:24

标签: multithreading winforms

我的应用程序中的所有内容都像我想要的那样工作,但我真的不明白究竟是怎么回事?我设置了几个线程来监控应用程序不时需要的一些资源。线程更新了几个标签,上面写着“一切都好”或“呃哦”(不是真的,但你明白了)。我设置了InvokeRequired的测试,以确保它在创建标签的线程上执行,一切都很好。

我不明白的是......如果我正在更新标签时输入一个文本框,我不应该在我的打字中看到某种延迟,因为它在同一个帖子上或者至少必须实现一些代码,所以我可以继续打字我离开的地方?我的猜测是Invoke方法可以处理事情,所以我可以继续输入我离开的位置。

它正在工作,所以我不应该抱怨,但我不想在一个月后突然弹出一些我真的不理解的错误。

1 个答案:

答案 0 :(得分:0)

简短的回答:没有什么可担心的。

说明:现在几乎所有的GUI系统,包括WinForms,都是单线程的,所以没有任何事情同时发生,但也考虑到大多数操作都是闪电般快速的(甚至是绘画)。

更好的解释可以解释GUI消息循环是如何工作的,但是我太懒了解释它,但我会解释你说你不理解的部分。这是您在文本框中输入时的事件序列:

  1. 根窗口收到的Keypress消息(通过其消息循环)
  2. Keypress消息从根窗口分发到文本框
  3. 文本框收到的键盘消息。文本框通过将新字符附加到其内部Value字符串来更新其内部状态。
  4. 文本框通知父窗口,因为文本值已更改,所以需要在下一个最近的机会重新绘制texbox。
  5. 根窗口获取下一条消息:这是执行方法调用的请求(因为从另一个线程调用InvokeBeginInvoke)。
  6. 根窗口执行此调用方法。
    1. 在这种情况下,就我所知,你的Invoke代码只设置了标签的Text属性,这个操作很快,因为它只设置了内部状态。标签,它不会导致它被直接绘制,而是(如在步骤4中),它将标签标记为“无效”,并且必须在下一个最佳机会重新绘制(参见步骤8)。
  7. 根窗口获取下一条消息:重新绘制文本框的请求
  8. 根窗口指示文本框重绘自己
  9. 根窗口获取下一条消息,或空闲等待接收下一条消息
  10. 所以是的, 可能存在延迟或消息周期延迟,例如,如果你的Invoke'代码执行时间超过几毫秒。如果您在Invoke'd代码中添加Thread.Sleep(10*1000),则会看到。