我有一个 C# 程序需要每 X 分钟分派一个线程,但前提是先前分派的线程(从 X 分钟开始)当前尚未运行。
一个普通的旧 Timer 单独是行不通的(因为它每 X 分钟分派一个事件,无论之前分派的进程是否已经完成)。
将要分派的进程在执行其任务所需的时间上有很大的不同——有时可能需要一秒钟,有时可能需要几个小时。如果它从上次启动时仍在处理,我不想再次启动该过程。
任何人都可以提供一些有效的 C# 示例代码吗?
我有一个 C# 程序需要每 X 分钟分派一个线程,但前提是先前分派的线程(从 X 分钟开始)当前尚未运行。
一个普通的旧 Timer 单独是行不通的(因为它每 X 分钟分派一个事件,无论之前分派的进程是否已经完成)。
将要分派的进程在执行其任务所需的时间上有很大的不同——有时可能需要一秒钟,有时可能需要几个小时。如果它从上次启动时仍在处理,我不想再次启动该过程。
任何人都可以提供一些有效的 C# 示例代码吗?
您可以在激活另一个线程之前检查线程是否处于活动状态。
使用Thread.IsAlive执行此操作。
我认为计时器可以在这种情况下工作。当计时器结束时,它会尝试获取同步对象上的锁。如果它成功,那么它会继续它的工作。如果它未能获得锁,则它知道最后一个线程尚未完成,因此返回。
如果您使用的是 .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);
}
}
在线程中使用 while(True) 循环。在循环顶部记录开始时间,执行任务,再次获取时间,计算已经过去了多少时间并与开始时间进行比较。如果这小于 X,则将差值转换为 ms 和 Sleep() 。
没有计时器,没有连续的线程创建,没有同步,没有轮询,根本没有机会同时运行两个任务实例。