每隔x秒同时启动多个功能?

时间:2012-08-17 15:58:40

标签: c# .net multithreading

我知道如何在x秒内启动一个函数,类似于this

private Timer timer1; 
public void InitTimer()
{
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 2000; // in miliseconds
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    function1();
    function2();
    function3();
}

此处的问题:功能无法同时运行。 Function2只能在Function1完成后运行。但是我希望它们能够在同一时间运行。这就是为什么我能做到这一点:

private void timer1_Tick(object sender, EventArgs e)
{
   Parallel.Invoke(
     () => Function1(),
     () => Function2(),
     () => Function3()
   );
}

这是用c#做最聪明的方法吗?我对Parallel.Invoke不理解的是:如果我的计时器设置为5秒,5秒后,如果我没有完成功能1,2和3,但我再次调用它们。我是否在主题中启动这些功能?是否有一些调用x-threads运行function1()(同时)?想知道真的很健康。

如果有人想获得更多信息:function1就是将文件x从文件夹a复制到b,function2仅用于读取文件夹b中的所有文件并保存信息, function3仅用于检查连接,如果有连接,则将相应的文件发送给某人。

对代码的任何建议?谢谢

3 个答案:

答案 0 :(得分:2)

Parallel.Invoke并行运行所有功能。由于function2不应该在function1之前运行,因此创建一个在后台运行它们但顺序运行的任务。

Task.Factory.StartNew(() =>
{
    function1();
    function2();
    function3();
});
  

如果我的计时器设置为5秒并且5秒后功能1,2和3未完成

您可以使用bool查看是否已完成。

答案 1 :(得分:1)

使用System.Threading.TimerThreadPool线程上安排回调,因此您无需创建新任务。它还允许您控制间隔以防止回调重叠。

// fired after 5 secs, but just once.
_timer = new System.Threading.Timer(Callback, null, 5000, Timeout.Infinite);

// on the callback you must re-schedule the next callback time;
private void Callback(Object state) {
   Function1();
   Function2();

   // schedule the next callback time 
   _timer.Change(5000, Timeout.Infinite);
}

答案 2 :(得分:0)

你看过任务吗?

你可以这样做:

Task[] tasks = new Task[3];
tasks[0] = Task.Factory.StartNew(() => Function1());
tasks[1] = Task.Factory.StartNew(() => Function2());
tasks[2] = Task.Factory.StartNew(() => Function3());
Task.WaitAll(tasks);

以上将允许您并行运行这些功能,这就是您想要的功能。

如果你不想在等待所有任务完成的timer1_Tick内部阻止,那么不要使用WaitAll ....而是你可以通过检查是否已完成任务来检查任务是否已完成计时器再次触发时的任务....然后决定是否发出下一批功能。