从另一个线程中侦听表单中的click事件

时间:2014-04-25 21:22:39

标签: c# multithreading winforms

好吧所以我有一个带有按钮和组合框的表单,当表单加载时我开始一个新的线程。在该线程中,我想从表单中侦听click事件,并从组合框中获取所选项目。这是最好的方法吗?

2 个答案:

答案 0 :(得分:0)

如果你在点击按钮时执行一些长时间运行的CPU昂贵的处理,我建议每次单击按钮时启动一个新线程。最好的方法是在主线程中监听click事件,并在事件触发时 - 启动一个新线程并在那里传递选定的值。

答案 1 :(得分:0)

您不能严格“倾听”C#中的事件。将事件处理程序附加到控件时所执行的操作是提供在事件发生时要调用的方法(作为委托)。您的方法将在调用类决定调用它的任何线程上调用,通常是发生事件原因的相同线程。对于Windows窗体控件,这始终是UI线程。

在您的事件处理程序中,您可以(并且经常应该)在另一个线程上调用另一个方法来执行实际工作。有很多方法可以做到这一点,从手动启动线程到线程池,再到使用TPL

如果您想要只控制一个线程,处理所有事件,那么最好的想法是建立生产者 - 消费者关系。有一个队列,你的事件处理程序会在其中放置一条指令来完成工作,并有一个线程将项目从队列中取出并处理它们。

要通知您的工作线程何时有新工作,您可以查看AutoResetEvent