在我的c#windows服务中,我正在启动多个线程。每个线程应该在特定时间段之后处理它的对象而没有活动。
我尝试了System.Threading.Timer和System.Timers.Timer类,但它们都在不同的线程上引发事件。
这令人满意:
答案 0 :(得分:3)
假设“一段没有活动的时间”意味着一个已经在WaitSleepJoin中的线程太长,你可以通过调用它来{{3 }}:
var t = new Thread(WorkerThred);
t.Start();
// when the thread's been inactive for too long, kill it!
t.Interrupt();
这将导致在目标线程中抛出Interrupt Method。因此,您可以捕获异常以处置线程的资源:
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];
}
我相信使用这种模式,您将能够创建满足您要求的线程管理器类。