-1

我的应用程序中的所有内容都按我想要的方式工作,但我真的不明白到底是怎么回事?我设置了几个线程来监控应用程序不时需要的一些资源。线程更新了几个标签,说“一切都好”或“哦”(不是真的,但你明白了)。我设置了 InvokeRequired 的测试,以确保它在创建标签的线程上执行并且一切正常。

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

它正在工作,所以我不应该抱怨,但我不希望一个月后出现一些我真的不明白的错误。

4

1 回答 1

0

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

说明:几乎所有现存的 GUI 系统,包括 WinForms,都是单线程的,所以什么都不会同时发生,但也要考虑到大多数操作也非常快(甚至绘画)。

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

  1. 根窗口接收到的按键消息(通过其消息循环)
  2. 按键消息从根窗口发送到文本框
  3. 文本框收到的按键消息。文本框通过将新字符附加到其内部Value字符串来更新其内部状态。
  4. 文本框通知父窗口该文本框需要在下一个最近的机会重新绘制,因为它的文本值已更改。
  5. 根窗口得到下一条消息:这是一个执行方法调用的请求(因为Invoke或被BeginInvoke另一个线程调用)。
  6. 根窗口执行这个调用方法。
    1. 在这种情况下,你Invoke的代码,据我所知,只是设置Text标签的属性,这个操作很快,因为它只是设置标签的内部状态,它不会导致它直接被绘制,而是(如第 4 步),它将标签标记为“无效”,并且必须在下一个最佳时机重新绘制(参见第 8 步)。
  7. 根窗口收到下一条消息:重绘文本框的请求
  8. 根窗口指示文本框重新绘制自身
  9. 根窗口获取下一条消息,或者处于空闲状态等待接收下一条消息

所以是的,消息周期可能存在滞后或延迟,例如,如果您Invoke的 'd 代码需要超过几毫秒的时间才能执行。如果您添加Thread.Sleep(10*1000)Invoke'd 代码,您会看到。

于 2013-04-19T19:39:01.927 回答