Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当C#窗体关闭时,后台线程是否结束?_C#_Multithreading_Windows Ce - Fatal编程技术网

当C#窗体关闭时,后台线程是否结束?

当C#窗体关闭时,后台线程是否结束?,c#,multithreading,windows-ce,C#,Multithreading,Windows Ce,我有一个使用.NET Compact Framework 3.5的C#应用程序,它根据用户交互打开多个表单。在一种特定的形式中,我有一个后台线程,定期检查应用程序运行的Windows CE设备的电池寿命。注意,这不是Main()中调用的表单。例如,Application.Run(newmyotherform()) 我的问题是,当MyForm关闭时,后台线程是否也会停止?或者它会在应用程序存在时停止(当Main()完成处理时)?如果后台线程在应用程序关闭时结束,我会找到解决方法,但如果线程在窗体关

我有一个使用.NET Compact Framework 3.5的C#应用程序,它根据用户交互打开多个表单。在一种特定的形式中,我有一个后台线程,定期检查应用程序运行的Windows CE设备的电池寿命。注意,这不是
Main()
中调用的表单。例如,
Application.Run(newmyotherform())Main()
中调用code>

我的问题是,当
MyForm
关闭时,后台线程是否也会停止?或者它会在应用程序存在时停止(当
Main()
完成处理时)?如果后台线程在应用程序关闭时结束,我会找到解决方法,但如果线程在窗体关闭时停止,则似乎没有必要

编辑:我选择使用
系统.Threading.Timer
而不是
线程

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

当后台线程完成委托的执行,或者整个进程中不再有前台线程时,后台线程将停止执行

后台线程在完成执行委托或整个进程中不再有前台线程时将停止执行

试着看看这里:为什么你会选择使用线程而不是计时器来做这样的事情?我想这将取决于检查电池的强度-如果这是一个阻塞任务,那么我可以在后台线程中看到处理它的原因。我本以为线程会一直运行,直到窗体被释放为止——当进程被释放时,线程肯定会停止——没有进程来承载它……@martin运行所需的时间不会改变它属于
计时器的时间。它最多只能决定您使用哪种类型的
计时器-我的想法是防止操作阻塞UI线程-应该考虑使用System.Timers.Timer…试着看看这里:为什么你选择使用线程而不是计时器来执行类似的操作?我想这取决于检查电池的强度-如果这是一个阻塞任务,那么我可以看到在一个特定的时间内处理它的原因背景线程。我本以为线程会一直运行,直到窗体被释放为止——当进程被释放时,线程肯定会停止——没有进程来承载它……@martin运行所需的时间不会改变它属于
计时器的时间。它最多只能决定您使用哪种类型的
计时器。对不起,Servy(我很乐意听从他…)-我的想法是防止操作阻塞UI线程-应该考虑使用系统。Timers.Timer…从Main()的角度来看是“整个过程”吗?或者从形式的角度来看?两者都不代表整个过程
Main
只是一个线程调用的一个方法。表单是在一个线程中的一个方法中创建的一个对象。进程是所有正在运行的线程的集合。从Main()的角度来看,是“整个进程”吗?或者从形式的角度来看?两者都不代表整个过程
Main
只是一个线程调用的一个方法。表单是在一个线程中的一个方法中创建的一个对象。进程是正在运行的所有线程的集合。
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();
}