Multithreading WinForm中的线程
我的应用程序中的所有东西都像我想要的那样工作,但我真的不知道到底是怎么回事?我设置了几个线程来监视应用程序不时需要的一些资源。这些线程更新了几个标签,上面写着“一切都好”或“啊哦”(虽然不是真的,但你知道了)。我设置了InvokeRequired的测试,以确保它在创建标签的线程上执行,并且一切正常 我不明白的是。。。如果我在更新标签的同时在文本框中输入,我不应该看到我的输入有某种滞后,因为它在同一个线程上,或者至少必须实现一些代码,以便我可以在我停止的地方继续输入?我的猜测是Invoke方法会处理一些事情,这样我就可以继续键入我中断的内容Multithreading WinForm中的线程,multithreading,winforms,Multithreading,Winforms,我的应用程序中的所有东西都像我想要的那样工作,但我真的不知道到底是怎么回事?我设置了几个线程来监视应用程序不时需要的一些资源。这些线程更新了几个标签,上面写着“一切都好”或“啊哦”(虽然不是真的,但你知道了)。我设置了InvokeRequired的测试,以确保它在创建标签的线程上执行,并且一切正常 我不明白的是。。。如果我在更新标签的同时在文本框中输入,我不应该看到我的输入有某种滞后,因为它在同一个线程上,或者至少必须实现一些代码,以便我可以在我停止的地方继续输入?我的猜测是Invoke方法会处
它正在工作,所以我不应该抱怨,但我不希望一个月后出现一些我真的不明白的bug。简短回答:没什么好担心的 解释:几乎每一个存在的GUI系统,包括WiFrm,都是单线程的,所以没有任何事情同时发生,但也要考虑到大多数操作都是闪电式的(甚至是绘画)。 更好的解释可以解释GUI消息循环是如何工作的,但是我懒得解释它,但是我会解释你说你不理解的部分。这是在文本框中键入时的事件顺序:
值
字符串中添加新字符来更新其内部状态Invoke
或BeginInvoke
)Invoke
'd代码只设置标签的Text
属性,此操作很快,因为它只设置标签的内部状态,它不会导致直接绘制标签,相反(如步骤4所示),它会将标签标记为“invalidated”必须在下一个最佳时机重新喷漆(参见步骤8)因此,是的,消息周期中存在延迟或延迟的可能性,例如,如果您的
调用
'd代码执行时间超过几毫秒。如果您在调用的代码中添加Thread.Sleep(10*1000)
,您将看到。您的问题是?如果没有看到一些代码,就不可能明确回答。然而,更新标签并不需要很长时间。。。这可能发生在您的计算机上,时间为微秒。如果我在textbox1中键入,则会更新label1和label2我的光标如何回到我停止的位置?一旦标签更新,文本框就不再是活动控件了?否-呈现标签中的文本不需要输入焦点。你会没事的-继续编码。谢谢你的反馈谢谢!这很有帮助。我担心的是那些控制光标的更新会破坏线程的目的。UI将只接收“工作”的结果,因此它将在瞬间发生。对于露齿而笑,我想我可以尝试更新一些“用户输入”控件,看看会发生什么。再次感谢您的反馈