在我的 c# windows 服务中,我启动了几个线程。每个线程都应该在没有活动的特定时间段后处理它的对象。
我尝试了 System.Threading.Timer 和 System.Timers.Timer 类,但它们都在不同的线程上引发事件。
这就是正在发生的事情:
- 在 service.start 期间创建多个线程
- 每个线程监视一个目录并为每个新文件激活资源扩展功能
- 在线程内没有活动 1 小时后(在此期间没有处理任何文件)我想清理该线程内的资源(结构映射、线程本地类)
在我的 c# windows 服务中,我启动了几个线程。每个线程都应该在没有活动的特定时间段后处理它的对象。
我尝试了 System.Threading.Timer 和 System.Timers.Timer 类,但它们都在不同的线程上引发事件。
这就是正在发生的事情:
假设“一段时间没有活动”是指一个线程在WaitSleepJoin中的时间过长,您可以通过调用其中断方法来中断这样的线程:
var t = new Thread(WorkerThred);
t.Start();
// when the thread's been inactive for too long, kill it!
t.Interrupt();
这将导致在目标线程中抛出ThreadInterruptedException 。因此,您可以捕获异常以释放线程的资源:
private void WorkerThred()
{
try
{
DoWork();
}
catch (ThreadInterruptedException)
{
DisposeResources();
}
}
现在您需要一些方法来跟踪每个线程保持非活动状态的时间量。例如,创建一个所有线程在进入睡眠或等待互斥锁之前必须调用的方法:
public static void UpdateLastActiveTime()
{
var t = Thread.CurrentThread;
if (!lastActiveTime.ContainsKey(t))
lastActiveTime.Add(t, DateTime.Now);
else
lastActiveTime[t] = DateTime.Now;
}
private static Dictionary<Thread, DateTime> lastActiveTime;
最后,要检查特定线程处于非活动状态的时间,请调用以下方法:
public static TimeSpan GetInactiveTime(Thread t)
{
// if thread isn't sleeping anymore update its time
if (t.ThreadState != ThreadState.WaitSleepJoin)
lastActiveTime[t] = DateTime.Now;
return DateTime.Now - lastActiveTime[t];
}
我相信使用这种模式,您将能够创建一个满足您要求的线程管理器类。