我有一个连续运行的Windows服务,并创建一些线程来完成一些工作。我想确保这些线程得到正确处理(完成后收集垃圾。
但是,我也希望能够定期检查它们是否还活着,如果它们还活着,则终止它们。我知道我不能保留对它们的任何引用,因为那样它们就不会被垃圾回收。
是否有其他方法来检查用户定义线程的存在/状态?我在想也许是这样的事情,使用 WeakReference
:(我现在无法完全测试,或者我只是自己测试)
List<WeakReference> weakReferences;
Thread myThread = new Thread(() => Foo());
WeakReference wr = new WeakReference(myThread);
weakReferences.Add(wr); //adds a reference to the thread but still allows it to be garbage collected
myThread.Start();
myThread = null; //get rid of reference so thread can be garbage collected
然后在我的 onTimeElapsed 事件开始时(每 5 分钟运行一次):
foreach(WeakReference wr in weakReferences)
{
Thread target = wr.Target as Thread; //not sure if this cast is really possible
if(target.IsAlive && otherLogic)
{
target.Abort();
{
}
但我不确定WeakReference是如何工作的。关于如何正确执行此操作的任何想法?
myThread
是方法变量吗? 还是...?
可能,线程将被简单地进行垃圾回收。如果myThread
是方法变量,则无需将myThread
设置为 null
,因为此时不存在。
但是,我要指出的是,线程实际上是非常昂贵的对象(仅堆栈就很难分配)。如果可能的话,我建议使用ThreadPool
(如果每个项目都是短暂的),或者使用定制的工作队列(如果更长),可能有多个工作人员为一个队列提供服务。
至于终止/中止线程...这从来都不是一个好主意;您不知道线程此时正在做什么。在那之后,你的整个过程可能注定要失败。如果可能,请考虑让工作人员偶尔检查"中止"标志。如果不可能,请考虑在单独的进程中执行工作。进程甚至比线程更昂贵,但它的优点是它是隔离的;你可以在不影响自己的情况下杀死它。当然,您仍然可以损坏它正在处理的任何文件,等等......
坦率地说,我考虑中止线程的主要时间是我的进程已经死亡,并且我试图尽快将其摆脱痛苦。
使用线程池。不要自己生成线程,也不要发明轮子。