我在为表单上的所有控件设置相同的事件处理程序时遇到问题.我想在我的应用程序中统一处理按下的f5-f7按钮,所以我尝试为表单上的所有控件注册相同的事件处理程序.我插了
foreach (System.Windows.Forms.Control cont in this.Controls)
cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress);
Run Code Online (Sandbox Code Playgroud)
在InitializeComponent()函数中,就在自动生成ResumeLayout/PerformLayout调用之前.不要介意名称MainForm_KeyPress,它现在实际上是一个KeyDown事件处理程序.
我还尝试在我的init()函数中插入代码,该函数从构造函数中调用.但结果是一样的:按键时不会发生事件.专注于表单的一个按钮.
但是如果我使用设计工具(将函数名称复制到KeyPress事件字段)为其中一个按钮实现处理程序,则如果按钮处于焦点,则事件会正确引发.
任何想法为什么foreach不起作用?
我正在使用Visual Studio .NET 2010中的Windows窗体创建GUI应用程序C#.我有多个线程,例如:
Control.Invoke().我的目标:当用户在主窗体上按(x)时,我想确保正确关闭窗体.这意味着我希望我的连接关闭,所有侧线程终止等.我正在尝试使用FormClosing事件.在那里我将KillThreads标志设置为true并等待侧线程终止.每个都有一张支票,比如if(KillThreads)
return;
Run Code Online (Sandbox Code Playgroud)
但是有一个问题.如果我试图等待所有线程终止
for(;;)
if(ActiveSideThreads == 0)
break;
closeConnection();
Run Code Online (Sandbox Code Playgroud)
线程N3冻结被阻塞Invoke(); 当然是,因为主gui线程处于无限循环中.所以表格结束会永远延迟.
如果我将on-close操作实现为线程过程4,并在FromClosing事件处理程序中创建一个新线程,则表单在线程4终止之前立即关闭,并Invoke()抛出错误-t.4无法及时关闭线程3.如果我Join(), Invoke()再次阻止添加呼叫,并且线程3永远不会终止,那么线程4将永远等待.
我该怎么办?有什么方法可以解决这个问题吗?