1

我知道如何在 x 秒内启动一个函数,它是这样的:

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是否仅用于检查连接以及是否存在连接将适当的文件发送给某人。

对代码有什么建议吗?谢谢

4

3 回答 3

2

Parallel.Invoke 并行运行所有函数。由于函数 2 不应在函数 1 之前运行,因此创建一个在后台按顺序运行它们的任务。

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

如果我的计时器设置为 5 秒并且在 5 秒后功能 1、2 和 3 没有完成怎么办

您可以使用 abool查看它们是否已完成。

于 2012-08-17T16:04:04.143 回答
1

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

// 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);
}
于 2012-08-19T09:57:30.333 回答
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...。相反,当您的计时器再次触发时,您可以通过检查任务上的 IsCompleted 来检查任务是否已完成。 ...然后决定是否发出下一批函数。

于 2012-08-17T16:02:43.317 回答