我想每隔一分钟运行一个流程,但有人告诉我,Timer
每个x minute + the time required for the process to finish
都在运行。但我希望线程每隔1
分钟工作一次,即使线程进程可能会持续工作1小时。
我希望你能得到我,所以在最后的图片中,我可能有10个线程一起工作。
可能吗?
答案 0 :(得分:3)
取决于计时器。简单测试表明System.Threading.Timer
以您想要的方式工作:
var timer = new Timer(s => { "Start".Dump(); Thread.Sleep(10000); "Hi!".Dump(); },
null, 1000, 1000);
Thread.Sleep(20000);
timer.Dump();
即使执行需要十秒钟,回调也会每秒执行一次。
这基本上是因为这个特定计时器的回调只是简单地发布到线程池,而例如System.Windows.Forms.Timer
实际上与UI线程相关联。当然,如果您只是在winforms计时器的回调中启动一个新线程(或队列工作,或启动一个新任务等),它将以类似(尽管不太精确)的方式工作。
使用适合工作的工具通常会使事情变得更容易:)
答案 1 :(得分:2)
创建一个Timer并在elapse事件上启动一个新线程来完成工作,如下例所示:
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();
}
}
答案 2 :(得分:1)
由于.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
};
}
});