【问题标题】:listening for click event in a form from another thread监听来自另一个线程的表单中的点击事件
【发布时间】:2014-04-25 21:22:39
【问题描述】:

好的,所以我有一个带有按钮和组合框的表单,当表单加载时,我会启动一个新线程。在该线程中,我想从表单中侦听单击事件并从组合框中获取所选项目。这样做的最佳方法是什么?

【问题讨论】:

  • 显示你的代码,这样更容易回答。
  • 您无法在另一个线程上运行的代码中侦听在 UI 线程上引发的事件。显然,您可以实现 Click 事件处理程序并让它执行任何事情。就像发信号一样。或者简单的开始。将线程浪费在人工发生的事情上非常昂贵。

标签: c# multithreading winforms


【解决方案1】:

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

【讨论】:

  • 太棒了!我想这正是我想要的。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多