2

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

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

这就是正在发生的事情:

  • 在 service.start 期间创建多个线程
  • 每个线程监视一个目录并为每个新文件激活资源扩展功能
  • 在线程内没有活动 1 小时后(在此期间没有处理任何文件)我想清理该线程内的资源(结构映射、线程本地类)
4

1 回答 1

3

假设“一段时间没有活动”是指一个线程在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];
}

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

于 2013-01-29T00:09:34.990 回答