2014-08-27 60 views
0

我有一个应用程序,这是一种测试某人,并持续约30分钟。在程序开始(第三方)期间,我的代码被调用,我注册时间并向应用程序返回一些信息,并将测试保存为“正在进行”。C#垃圾收集器的“KeepAlive”和线程

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

不过,我从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. 
} 
+0

会为长时间运行的进程提供服务来处理这个问题吗? – JNYRanger 2014-08-27 19:10:34

+0

如果你正在谈论jitbit的答案,我怀疑除此之外还有更多。这不是GC ......基本上这个问题是你已经链接的问题的重复,不是吗? – 2014-08-27 19:13:42

+0

@JonSkeet我不认为它是重复的,因为我的线程根本不会运行,它会在启动之前睡眠很长时间,所以基本上这是一个关于jitbit的答案的问题。这就是为什么我寻找解决方案并找到了有关KeepAlive方法的原因。 – Danicco 2014-08-27 19:17:01

回答

5

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

您引用的答案是错误的。但是在这个问题上有三个正确的答案。你恰好相信错误的少数人的答案。

你没有问题要解决。

+0

我怀疑答案会长得多。 – 2014-08-27 19:29:05

+2

@LynnCrumbling高级经验的SO用户有责任降低这些答案。到目前为止,责任还没有被接受。 – usr 2014-08-27 19:29:48

+0

@usr我现在正在这样做。我不确定这个可怜的答案是如何得到保证的。和+1 .. – 2014-08-27 19:32:12