c#每X分钟调度一次线程

c#每X分钟调度一次线程,c#,C#,我有一个C#程序,需要每X分钟调度一个线程,但前提是之前调度的线程(来自X分钟)当前未运行 一个普通的旧计时器无法单独工作(因为它每X分钟发送一个事件,而不管之前发送的进程是否已经完成) 将被调度的进程在执行其任务所需的时间上有很大差异——有时可能需要一秒钟,有时可能需要几个小时。如果进程从上次启动时起仍在处理,我不想再次启动该进程 有人能提供一些有效的C#示例代码吗?在激活另一个线程之前,您只需检查该线程是否处于活动状态。 使用。我认为计时器可以在这种情况下工作。当计时器过期时,它试图获得同步

我有一个C#程序,需要每X分钟调度一个线程,但前提是之前调度的线程(来自X分钟)当前未运行

一个普通的旧计时器无法单独工作(因为它每X分钟发送一个事件,而不管之前发送的进程是否已经完成)

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


有人能提供一些有效的C#示例代码吗?

在激活另一个线程之前,您只需检查该线程是否处于活动状态。

使用。

我认为计时器可以在这种情况下工作。当计时器过期时,它试图获得同步对象的锁定。如果成功了,就继续工作。如果无法获得锁,它知道最后一个线程尚未完成,因此返回

如果您使用的是.NET4.0或更高版本,则可以使用

在线程中使用while(True)循环。在循环的顶部记录开始时间,执行任务,再次获取时间,计算时间间隔,并与开始时间进行比较。如果该值小于X,请将差值转换为ms,并将其转换为Sleep()


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

这里已经多次询问并回答了可能的重复问题。用于各种计时器类。
bool acquiredLock = false;
try
{
    Monitor.TryEnter(lockObject, ref acquiredLock);
    if (acquiredLock)
    {
        //do your work here
    }
}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}