4

我有一个包含计时器的用户控件。当定时器事件运行时,它会调用一些线程。

用户控制

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();
     }
}

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

4

1 回答 1

2

处理表单对您的线程没有影响。

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

每次计时器滴答作响,你都会做thd = new Thread 两次。如果您的计时器滴答十次,则thd指向您最近的线程,但可能还有 19 个其他线程仍在运行,其中任何一个都可能使您的应用程序保持活动状态。

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

于 2013-09-13T15:09:27.300 回答