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_Winforms - Fatal编程技术网

C# 级联线程终止

C# 级联线程终止,c#,multithreading,winforms,C#,Multithreading,Winforms,对于时间/日期驱动的线程应用程序,我使用创建的线程(new Thread(),线程都放在一个列表中),其中调用的方法运行未定义的时间(可以是1秒甚至一整天)。在此方法中,可以创建新(子)线程(也可以使用new thread()) 现在,当应用程序的线程部分结束时(手动或因为程序结束),我将查看我创建的线程列表,并手动结束这些线程 现在据我所知,创建子线程的线程的结束(因此,包含创建第二个线程的方法的线程)并不意味着子线程的结束。所以我的问题是:有没有什么好的方法来管理它,线程终止会级联到它的子线

对于时间/日期驱动的线程应用程序,我使用创建的线程(
new Thread()
,线程都放在一个列表中),其中调用的方法运行未定义的时间(可以是1秒甚至一整天)。在此方法中,可以创建新(子)线程(也可以使用
new thread()

现在,当应用程序的线程部分结束时(手动或因为程序结束),我将查看我创建的线程列表,并手动结束这些线程

现在据我所知,创建子线程的线程的结束(因此,包含创建第二个线程的方法的线程)并不意味着子线程的结束。所以我的问题是:有没有什么好的方法来管理它,线程终止会级联到它的子线程(或者我误解了线程是如何在那里工作的?)

编辑:
正如有人问的:这里提到的所有线程都是后台线程(因此后台进程会创建一个子后台进程,当父进程结束时,该子进程将结束)。

您应该以受控的方式停止线程,不要让操作系统(假设它们是后台线程)或调用Thread.Abort(),如果这就是“线程终止”的含义

使用CancellationTokenSource创建CancellationToken,并为每个子线程提供此标记。线程内的方法/循环应检查token.IsCancellationRequested()。然后您只需要调用TokenSource.Cancel一次(在主线程中)


请参见

这些是后台线程还是前台线程?(假设前者安全吗?)所有这些线程都是后台线程。(文章中没有提到前台线程,但它是一个winforms应用程序,用户可以在其中执行一些操作,而时间/日期驱动的线程只是后台操作,可以让用户更轻松地生活)如果它们是后台线程,您不必担心。CLR将在进程退出时停止所有后台线程。据我所知,只有在所有前台进程停止时。但在本例中,我有一个后台进程,它启动另一个后台进程,我需要在第一个后台进程停止时立即停止,或者(就像我的意思是,如果我误解了线程在C#中的工作方式)是否仍然会自动停止?我要找的引文基本上是Sriram已经提到的。。。好的,所以没有一种自动的方法,进程可以将它的子进程带下来。只有通过取消令牌的手动(在我的确切情况下,我不能相信那些,因为我有线程可以挂起一次又一次)或通过调用thord.abt(或OS注意,如果所有的前景进程关闭)。@ Toasase:如果一些后台操作可能挂起,比你应该考虑在单独的进程,而不是线程运行它们。无法保证您可以杀死特定的托管线程(例如,当线程执行非托管代码时)。有趣的一点是@Dennis,所以它可以是该线程。对于挂起的非托管代码,中止失败?(同样如上所述:有些过程可能需要相当长的时间才能到达取消令牌,因为被调用的底层方法需要很长时间来处理信息,并且不能被进一步拆分以允许更快地到达取消令牌,这与可能的挂起情况不同)。Tnx对此进行了澄清。