我有一个C#程序需要每隔X分钟调度一个线程,但前提是先前调度的线程(从X分钟开始)以前还没有运行。
单独一个普通的旧计时器将无法工作(因为它无论是否每次X分钟都会调度一个事件,或者先前调度的进程是否已经完成)。
将要执行调度的进程在执行任务所需的时间内变化很大 - 有时可能需要一秒钟,有时可能需要几个小时。如果它仍然是从上次启动时开始处理,我不想再次启动该过程。
任何人都可以提供一些有效的C#示例代码吗?
答案 0 :(得分:1)
您可以在激活另一个线程之前检查线程是否处于活动状态 使用Thread.IsAlive执行此操作。
答案 1 :(得分:1)
我认为计时器可以在这种情况下工作。当计时器过去时,它尝试获取同步对象的锁定。如果它成功,那么它继续它的工作。如果它无法获得锁定,它知道最后一个线程还没有完成,所以返回。
如果您使用的是.Net 4.0或更高版本,则可以使用Monitor.TryEnter(object, bool)
。
bool acquiredLock = false;
try
{
Monitor.TryEnter(lockObject, ref acquiredLock);
if (acquiredLock)
{
//do your work here
}
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
答案 2 :(得分:1)
在线程中使用while(True)循环。记录循环顶部的开始时间,执行任务,再次获取时间,计算已消耗的时间并与开始时间进行比较。如果这小于X,则将差值转换为ms和Sleep()。
没有计时器,没有连续的线程创建,没有同步,没有轮询,没有任何机会可以同时运行两个任务实例。