【发布时间】:2014-08-28 03:22:55
【问题描述】:
我有一个应用程序,它是对某人的某种测试,持续大约 30 分钟。在程序启动期间(第 3 方),我的代码被调用,我注册时间并向应用程序返回一些信息,并将测试保存为“正在进行”。
大约 30 分钟后,我希望程序返回给我并将测试结果发送给我,以便我保存并完成该过程。有时由于各种原因,这不会发生。 所以我正在考虑实现一个代码来启动一个线程,让它休眠大约 35 分钟(它可以的最大持续时间),当它运行时它只做一件事:如果测试仍然是“正在进行”,它会更新它变为“FAILED”或其他状态。
但是,我从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.
}
【问题讨论】:
-
会为长时间运行的进程提供服务吗?
-
如果您在谈论 jitbit 的答案,我怀疑这不仅仅是表面上的。这不是 GC ......基本上这个问题是你已经链接到的那个的重复,不是吗?
-
@JonSkeet 我不认为这是重复的,因为我的线程根本不会运行,它会在它开始之前休眠很长时间,所以基本上这是一个关于jitbit的问题回答。这就是我寻找解决方案并发现 KeepAlive 方法的原因。
-
@Danicco:所以你应该对 jitbit 的回答添加评论。如果线程处于休眠状态,它基本上仍然处于活动状态。我对那个 jitbit 的回答有强烈的怀疑……
-
KeepAlive不会在那里做太多事情,因为它只会在当前方法中保持对象处于活动状态。Start是非阻塞的,所以主线程几乎会立即退出。然后程序由生成的线程继续运行。
标签: c# .net multithreading garbage-collection