C#垃圾收集器" KeepAlive"和线程

时间:2014-08-27 19:07:50

标签: c# .net multithreading garbage-collection

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

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

但是,我从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.
}

1 个答案:

答案 0 :(得分:6)

由于GC,线程不会中止。实际上,不可能可靠地中止线程。 (尝试中止try {} finally { while(true); }。)

你提到的答案是错误的。但是在这个问题上有3个正确的答案。你碰巧相信错误的,少数人的回答。

你可以解决这个问题。