C# 使用keydown启动线程,并通过释放(keyup)停止线程?

C# 使用keydown启动线程,并通过释放(keyup)停止线程?,c#,multithreading,winforms,events,keydown,C#,Multithreading,Winforms,Events,Keydown,所以我试着用键事件来操作线程,我设法通过点击键E和键R(两个线程)来启动它们,但我不能通过重新设置键来阻止它们,因为某些原因,键启动事件不起作用。。。 (启动、停止后,我希望在需要时重新启动它们…因此没有计时器…) C#WINDOWS应用程序代码:(我正在使用的方法) ((方法是这样的?: private void Yawspeed_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.E) { yaw

所以我试着用键事件来操作线程,我设法通过点击键E和键R(两个线程)来启动它们,但我不能通过重新设置键来阻止它们,因为某些原因,键启动事件不起作用。。。 (启动、停止后,我希望在需要时重新启动它们…因此没有计时器…)

C#WINDOWS应用程序代码:(我正在使用的方法)

((方法是这样的?:

private void Yawspeed_KeyUp(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.E)
   {
       yawspeedRightThread.Abort();
   }
   if (e.KeyCode == Keys.R)
   {
       yawspeedLeftThread.Abort();
   }
}
(结束…)

private void Yawspeed\u加载(对象发送方,事件参数e)
{
}
#区域线程函数
/// 
///此线程将移动光标
/// 
公共静态无效YawspeedRightThread()
{
while(true)

…(其余代码、线程本身、函数…

首先,您不能重新启动线程。如果启动线程,线程将完成,然后您再次尝试启动同一个线程对象,它将引发异常,告诉您这是不可能的。您应该改为使用

现在假设您将忽略上述内容,并尝试这样做。需要检查的两件事是:

  • 您已经向控件/窗体注册了密钥更新事件
  • 在执行测试时,控件/窗体实际上具有焦点

  • 最后,确保没有调用key up。我之所以这么说,是因为Thread.Abort()实际上不能保证结束线程的执行。它只是在线程中抛出一个异常。这意味着如果您在线程的函数中添加了一个捕获“异常”的try catch对象时,try-catch将捕获中止强制进入的异常,并允许线程继续执行。这是不建议中止的原因之一,并且鼓励人们使用其他机制来结束线程,例如触发布尔值。

    您能更清楚地描述您打算做什么吗?这似乎有些奇怪帽子不寻常…您已经问了这个问题。看起来您删除了上一个问题,也销毁了SO用户添加的评论。这对任何人都没有帮助,请不要这样做。Control.KeyUp事件“在控件具有焦点时释放键时发生”。它仍然具有焦点吗?
    private void Yawspeed_KeyUp(object sender, KeyEventArgs e)
    {
       if (e.KeyCode == Keys.E)
       {
           yawspeedRightThread.Abort();
       }
       if (e.KeyCode == Keys.R)
       {
           yawspeedLeftThread.Abort();
       }
    }
    
        private void Yawspeed_Load(object sender, EventArgs e)
        {
    
        }
    
        #region Thread Functions
        /// <summary>
        /// This thread will move your cursor
        /// </summary>
        public static void YawspeedRightThread()
        {
    
    
            while (true)