c#不管线程时间如何,每一分钟运行一个线程
本文关键字:线程 运行 一个 一分钟 时间 不管 | 更新日期: 2023-09-27 18:26:48
我想每一分钟运行一个进程,但有人告诉我,Timer
在每个x minute + the time required for the process to finish
工作。但我希望线程每CCD_ 3分钟工作一次,即使线程进程可能持续工作1小时。
我希望你能理解我,所以在最终的图像中,我可能有10个线程在一起工作。
这可能吗?
取决于计时器。简单的测试表明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
};
}
});