我有一个用户控件,其中包括计时器.当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线程关闭时终止.但是,我建议以这种方式创建这么多线程可能不是一个有效的模型,你最好修改你的设计只运行一两个工作线程,而不是踢几十个.