我有一个应用程序,对某人进行某种测试,持续约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.
}
答案 0 :(得分:6)
由于GC,线程不会中止。实际上,不可能可靠地中止线程。 (尝试中止try {} finally { while(true); }
。)
你提到的答案是错误的。但是在这个问题上有3个正确的答案。你碰巧相信错误的,少数人的回答。
你可以解决这个问题。