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

Dan*_*cco 0 .net c# multithreading garbage-collection

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

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

但是,我从读这里是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.
}
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 6

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

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

你有没有问题要解决.

  • @LynnCrumbling高经验的SO用户有责任对这些答案进行投票.到目前为止,责任尚未得到解决. (2认同)
  • 请投票删除该答案.它误导了初学者,如果他们不像OP那样提出问题,那么它本身就会被误解. (2认同)