c#尽管有线程时间,每隔一分钟运行一个线程

时间:2014-10-16 11:02:19

标签: c# .net multithreading

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

我希望你能得到我,所以在最后的图片中,我可能有10个线程一起工作。

可能吗?

3 个答案:

答案 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
        };
    }  
});