我有一个应用程序,这是一种测试某人,并持续约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.
}
会为长时间运行的进程提供服务来处理这个问题吗? – JNYRanger 2014-08-27 19:10:34
如果你正在谈论jitbit的答案,我怀疑除此之外还有更多。这不是GC ......基本上这个问题是你已经链接的问题的重复,不是吗? – 2014-08-27 19:13:42
@JonSkeet我不认为它是重复的,因为我的线程根本不会运行,它会在启动之前睡眠很长时间,所以基本上这是一个关于jitbit的答案的问题。这就是为什么我寻找解决方案并找到了有关KeepAlive方法的原因。 – Danicco 2014-08-27 19:17:01