【问题标题】:C# Garbage Collector's "KeepAlive" and ThreadsC# 垃圾收集器的“KeepAlive”和线程
【发布时间】:2014-08-28 03:22:55
【问题描述】:

我有一个应用程序,它是对某人的某种测试,持续大约 30 分钟。在程序启动期间(第 3 方),我的代码被调用,我注册时间并向应用程序返回一些信息,并将测试保存为“正在进行”。

大约 30 分钟后,我希望程序返回给我并将测试结果发送给我,以便我保存并完成该过程。有时由于各种原因,这不会发生。 所以我正在考虑实现一个代码来启动一个线程,让它休眠大约 35 分钟(它可以的最大持续时间),当它运行时它只做一件事:如果测试仍然是“正在进行”,它会更新它变为“FAILED”或其他状态。

但是,我从here 读到,C# 的垃圾收集器可以收集它假定为非活动的线程,我对此很担心,所以我想问一下这个KeepAlive 方法适用于线程,或者如果有任何可靠的方法来测试它(因为即使我确实等待了 35 分钟让它发生,也可能存在 GC 实际收集线程并且一切都失败的情况)。

那么,这个工作的正确方法是什么,或者如果不是这样,我应该怎么做?

static void Main(string[] args)
{
    //After all the startup functions are done...
    Thread thread = new Thread( () => UpdateTest(1) );
    thread.Start();

    //My thread is supposedly safe...?
    GC.KeepAlive(thread);
}

static void UpdateTest(int testID)
{
    Thread.Sleep(210000); //Sleep for 35min

    //Search the database for the testID, update it if it's still ONGOING.
}

【问题讨论】:

  • 会为长时间运行的进程提供服务吗?
  • 如果您在谈论 jitbit 的答案,我怀疑这不仅仅是表面上的。这不是 GC ......基本上这个问题是你已经链接到的那个的重复,不是吗?
  • @JonSkeet 我不认为这是重复的,因为我的线程根本不会运行,它会在它开始之前休眠很长时间,所以基本上这是一个关于jitbit的问题回答。这就是我寻找解决方案并发现 KeepAlive 方法的原因。
  • @Danicco:所以你应该对 jitbit 的回答添加评论。如果线程处于休眠状态,它基本上仍然处于活动状态。我对那个 jitbit 的回答有强烈的怀疑……
  • KeepAlive 不会在那里做太多事情,因为它只会在当前方法中保持对象处于活动状态。 Start 是非阻塞的,所以主线程几乎会立即退出。然后程序由生成的线程继续运行。

标签: c# .net multithreading garbage-collection


【解决方案1】:

线程不会因为 GC 而中止。事实上,不可能可靠地中止线程。 (尝试中止try {} finally { while(true); }。)

您引用的答案是错误的。但是该问题有3个正确答案。你只是碰巧相信了错误的、少数人的答案。

没有问题需要你解决。

【讨论】:

  • 我怀疑这个答案会持续更长时间。
  • @LynnCrumbling 经验丰富的 SO 用户有责任否决这样的答案。到目前为止,还没有追究责任。
  • 请投票删除该答案。它会误导初学者,如果他们不像 OP 那样提出问题,它本身就会成为误解。
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
相关资源
最近更新 更多