C#如何及时停止线程?

我有一个用户控件,其中包括计时器.当timer事件运行时,它将调用一些线程.

用户控制

class MyControl
{
    public Timer iTime
    {
        get;
        set;
    }

    Timer tmr;

    public MyControl
    {
    tmr = new Timer();
    }

    // Some Properties
}
}

主要表格

class MyForm
{
     Thread thd;

     MyControl cls = new MyClass();
     cls.iTime.Tick += new EventHandler(iTime_Tick);

     void iTime_Tick(object sender, EventArgs e)
     {
         thd = new Thread(delegate() { doWork(1); });
         thd.Start();

         thd = new Thread(delegate() { doOtherJob(); });
         thd.Start();
     }

     delegate void notif(int Param1);

     void Job(int Param1)
     {
         if (this.InvokeRequired) 
         {
            notif handler = new notif(notifParam);
            this.Invoke(handler, new object[] { Param1 });
         }
         else
         {
        // Other Process
         }
     }

     private void Logout()
     {
        cls.iTime.Stop();
        cls.iTime.Enabled = false;
        cls.iTime.Tick -= new EventHandler(iTime_Tick);

        thd.abort();
        thd.join();
     }
}

如何在计时器中终止线程?当我取消订阅计时器事件甚至关闭表单时,线程仍然运行.

最佳答案 处理表单对您的线程没有影响.

你的代码显然是不完整的(例如MyControl cls = new MyClass();,我们不知道doWork或doOtherJob是什么),但我怀疑问题的一部分是你只有一个线程变量.

每次计时器滴答时,你都会做两次新线程.如果你的计时器滴答十次,那么thd指向你最近的线程,但是有可能还有19个其他线程在运行,其中任何一个都可能使你的应用程序保持活跃状态​​.

可能有帮助的一件事是在您创建的线程上明确地将.IsBackground设置为true,因为这将鼓励它们在UI线程关闭时终止.但是,我建议以这种方式创建这么多线程可能不是一个有效的模型,你最好修改你的设计只运行一两个工作线程,而不是踢几十个.

点赞