1

我有一个 C# 程序需要每 X 分钟分派一个线程,但前提是先前分派的线程(从 X 分钟开始)当前尚未运行。

一个普通的旧 Timer 单独是行不通的(因为它每 X 分钟分派一个事件,无论之前分派的进程是否已经完成)。

将要分派的进程在执行其任务所需的时间上有很大的不同——有时可能需要一秒钟,有时可能需要几个小时。如果它从上次启动时仍在处理,我不想再次启动该过程。

任何人都可以提供一些有效的 C# 示例代码吗?

4

3 回答 3

1

您可以在激活另一个线程之前检查线程是否处于活动状态。
使用Thread.IsAlive执行此操作。

于 2013-01-31T09:44:02.550 回答
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);
    }
}
于 2013-01-31T09:45:48.877 回答
1

在线程中使用 while(True) 循环。在循环顶部记录开始时间,执行任务,再次获取时间,计算已经过去了多少时间并与开始时间进行比较。如果这小于 X,则将差值转换为 ms 和 Sleep() 。

没有计时器,没有连续的线程创建,没有同步,没有轮询,根本没有机会同时运行两个任务实例。

于 2013-01-31T09:46:09.180 回答