【问题标题】:Does the task still survive when the main thread that creates it has been killed in c#?当创建它的主线程在 c# 中被杀死时,任务是否仍然存在?
【发布时间】:2015-08-28 10:02:54
【问题描述】:

我有一个创建任务的主线程:

new TaskFactory(cancellationToken).StartNew(() => DoSomething(cancellationToken), 
                                            TaskCreationOptions.LongRunning);

我想知道当创建任务的主线程在c#中被杀死时,任务是否仍然存在。

【问题讨论】:

  • 我试过了,发现当我的主线程消失时任务被杀死了。由于我用于测试的那个只是在 Windows 服务中,我想知道这是否在所有情况下都是全局正确的(例如 UI)。
  • 干得好。请参阅 Rich 的最佳答案。干杯

标签: c# task


【解决方案1】:

如果进程的主线程被终止,则进程中止。当一个进程被杀死时,所有线程(和其他拥有的资源)也被关闭/终止/杀死。

因此,如果你的进程的主线程创建了一个工作线程并且主线程被杀死,那么工作线程也被终止。

不要对TaskCreationOptions.LongRunning 枚举感到困惑 - 这只是底层线程池管理器的一个指标,它可能希望在最大线程池大小的正常限制之外创建此线程。

【讨论】:

  • 这是更直接的答案。谢谢。
  • 很高兴这是有道理的 :) 注意:这就是为什么强行杀死一个可能会挂起/无响应的进程通常会解锁/解除阻塞/释放线程、文件、文件夹、套接字等资源并释放关联的内存以在其他地方重复使用。
【解决方案2】:

如果 AppDomain(通常等于进程)在“杀死”创建任务的线程后仍然存在,那么任务将继续存在。

当任务尝试完成时会发生什么取决于同步上下文 - 如果它必须在已中止的线程上继续,它将抛出/挂起,如果它可以在线程池线程上继续,则任务将能够完成。

请注意,通常对于基于 UI 的应用,中止主线程意味着至少停止事件循环,这将导致进程被视为“无响应”并可能被终止。

【讨论】:

  • 这是有道理的。谢谢。如果您可以附上一些链接(例如 msdn),并提供更多详细信息,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多