检测特定线程中没有活动的时间段

时间:2013-01-24 20:15:12

标签: c# multithreading

在我的c#windows服务中,我正在启动多个线程。每个线程应该在特定时间段之后处理它的对象而没有活动。

我尝试了System.Threading.Timer和System.Timers.Timer类,但它们都在不同的线程上引发事件。

这令人满意:

  • 在service.start
  • 期间创建多个线程
  • 每个线程监视一个目录并为每个新文件激活资源扩展函数
  • 在线程内没有活动1小时后(在此期间没有处理文件)我想清理该线程内的资源(structuremap,threadlocal classes)

1 个答案:

答案 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];
}

我相信使用这种模式,您将能够创建满足您要求的线程管理器类。