c#不管线程时间如何,每一分钟运行一个线程

本文关键字:线程 运行 一个 一分钟 时间 不管 | 更新日期: 2023-09-27 18:26:48

我想每一分钟运行一个进程,但有人告诉我,Timer在每个x minute + the time required for the process to finish工作。但我希望线程每CCD_ 3分钟工作一次,即使线程进程可能持续工作1小时。

我希望你能理解我,所以在最终的图像中,我可能有10个线程在一起工作。

这可能吗?

c#不管线程时间如何,每一分钟运行一个线程

取决于计时器。简单的测试表明System.Threading.Timer按照您想要的方式工作:

var timer = new Timer(s => { "Start".Dump(); Thread.Sleep(10000); "Hi!".Dump(); }, 
                      null, 1000, 1000);
Thread.Sleep(20000);
timer.Dump();

回调每秒钟执行一次,即使执行需要10秒钟。

这基本上是因为这个特定定时器的回调只是发布到线程池,而例如System.Windows.Forms.Timer实际上绑定到UI线程。当然,如果您只是在winforms定时器的回调中启动一个新线程(或队列工作,或启动一个任务等),它将以类似的方式工作(尽管不那么精确)。

使用正确的工具通常会让事情变得更容易:)

创建一个Timer,并在过去事件上启动一个新线程来完成工作,如下面的示例:

public class Example
{
    private static Timer aTimer;
    public static void Main()
    {
        // Create a timer with a two second interval.
        aTimer = new Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.Enabled = true;
        Console.WriteLine("Press the Enter key to exit the program... ");
        Console.ReadLine();
        Console.WriteLine("Terminating the application...");
    }
    public static void DoWork()
    {
        var workCounter = 0;
        while (workCounter < 100)
        {
            Console.WriteLine("Alpha.Beta is running in its own thread." + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1000);
            workCounter++;
        }
    }
    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        // Create the thread object, passing in the method
        // via a delegate.
        var oThread = new Thread(DoWork);
        // Start the thread
        oThread.Start();
    }

}

因为.NET 4.0任务优先于线程。任务管理的开销是最小的。

// Create a task spawning a working task every 1000 msec
var t = Task.Run(async delegate 
{ 
    while (isRunning)
    {
        await Task.Delay(1000);
        Task.Run(() => 
        {
            //your work
        };
    }  
});