我有一个使用.NET Compact Framework 3.5的C#应用程序,它根据用户交互打开多个表单。在一个特定的形式中,我有一个后台线程,定期检查应用程序运行的Windows CE设备的电池寿命。请注意,这不是Main()
中调用的表单。例如,Application.Run(new MyOtherForm());
中会调用Main()
。
public MyForm()
{
Thread mythread = new Thread(checkBatteryLife);
mythread.IsBackground = true;
mythread.Start();
}
private void checkBatteryLife()
{
while(true)
{
// Get battery life
Thread.Sleep(1000);
}
}
我的问题是,当MyForm
关闭时,后台线程也会停止吗?或者当应用程序存在时(Main()
完成处理时)它会停止吗?如果后台线程在应用程序关闭时结束,我发现this解决方法,但如果线程在表单关闭时停止,则似乎没有必要。
编辑:我选择使用System.Threading.Timer
代替Thread
。
private System.Threading.Timer batteryLifeTimer;
public MyForm()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
TimerCallback tcb = checkBatteryLife;
this.batteryLifeTimer = new System.Threading.Timer(tcb, autoEvent, 1000, 10000);
}
private void checkBatteryLife(Object stateInfo)
{
// Get battery life.
// Update UI if battery life percent changed.
}
private void MyForm_Closing(object sender, CancelEventArgs e)
{
this.batteryLifeTimer.Dispose();
}
答案 0 :(得分:4)
当后台线程完成执行委托时,或者在整个过程中没有更多前台线程时,后台线程将停止执行。