Multithreading WinForm中的线程

Multithreading WinForm中的线程,multithreading,winforms,Multithreading,Winforms,我的应用程序中的所有东西都像我想要的那样工作,但我真的不知道到底是怎么回事?我设置了几个线程来监视应用程序不时需要的一些资源。这些线程更新了几个标签,上面写着“一切都好”或“啊哦”(虽然不是真的,但你知道了)。我设置了InvokeRequired的测试,以确保它在创建标签的线程上执行,并且一切正常 我不明白的是。。。如果我在更新标签的同时在文本框中输入,我不应该看到我的输入有某种滞后,因为它在同一个线程上,或者至少必须实现一些代码,以便我可以在我停止的地方继续输入?我的猜测是Invoke方法会处

我的应用程序中的所有东西都像我想要的那样工作,但我真的不知道到底是怎么回事?我设置了几个线程来监视应用程序不时需要的一些资源。这些线程更新了几个标签,上面写着“一切都好”或“啊哦”(虽然不是真的,但你知道了)。我设置了InvokeRequired的测试,以确保它在创建标签的线程上执行,并且一切正常

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


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

简短回答:没什么好担心的

解释:几乎每一个存在的GUI系统,包括WiFrm,都是单线程的,所以没有任何事情同时发生,但也要考虑到大多数操作都是闪电式的(甚至是绘画)。 更好的解释可以解释GUI消息循环是如何工作的,但是我懒得解释它,但是我会解释你说你不理解的部分。这是在文本框中键入时的事件顺序:

  • 根窗口接收的按键消息(通过其消息循环)
  • 按键消息从根窗口发送到文本框
  • 文本框接收到按键信息。Textbox通过在其内部
    字符串中添加新字符来更新其内部状态
  • textbox通知父窗口texbox需要在下一个最近的机会重新绘制,因为其文本值已更改
  • 根窗口获取下一条消息:这是执行方法调用的请求(因为从另一个线程调用了
    Invoke
    BeginInvoke
  • 根窗口执行此调用方法。
  • 在这种情况下,据我所知,您的
    Invoke
    'd代码只设置标签的
    Text
    属性,此操作很快,因为它只设置标签的内部状态,它不会导致直接绘制标签,相反(如步骤4所示),它会将标签标记为“invalidated”必须在下一个最佳时机重新喷漆(参见步骤8)
  • 根窗口获取下一条消息:请求重新绘制文本框
  • 根窗口指示文本框重新绘制自身
  • 根窗口获取下一条消息,或者空闲等待接收下一条消息

  • 因此,是的,消息周期中存在延迟或延迟的可能性,例如,如果您的
    调用
    'd代码执行时间超过几毫秒。如果您在调用的代码中添加
    Thread.Sleep(10*1000)
    ,您将看到。

    您的问题是?如果没有看到一些代码,就不可能明确回答。然而,更新标签并不需要很长时间。。。这可能发生在您的计算机上,时间为微秒。如果我在textbox1中键入,则会更新label1和label2我的光标如何回到我停止的位置?一旦标签更新,文本框就不再是活动控件了?否-呈现标签中的文本不需要输入焦点。你会没事的-继续编码。谢谢你的反馈谢谢!这很有帮助。我担心的是那些控制光标的更新会破坏线程的目的。UI将只接收“工作”的结果,因此它将在瞬间发生。对于露齿而笑,我想我可以尝试更新一些“用户输入”控件,看看会发生什么。再次感谢您的反馈