C# 每x秒同时启动几个功能?

C# 每x秒同时启动几个功能?,c#,.net,multithreading,C#,.net,Multithreading,我知道如何在x秒内启动函数,它类似于: 这里的问题是:函数不能同时运行功能2只能在功能1完成时运行。但我希望它们同时运行。这就是为什么我可以这样做: private void timer1_Tick(object sender, EventArgs e) { Parallel.Invoke( () => Function1(), () => Function2(), () => Function3() ); } 这是c语言中最聪明的方

我知道如何在x秒内启动函数,它类似于:

这里的问题是:函数不能同时运行<代码>功能2只能在
功能1
完成时运行。但我希望它们同时运行。这就是为什么我可以这样做:

private void timer1_Tick(object sender, EventArgs e)
{
   Parallel.Invoke(
     () => Function1(),
     () => Function2(),
     () => Function3()
   );
}
这是c语言中最聪明的方法吗?我不理解并行调用的什么:如果我的计时器设置为5秒,5秒后功能1、2和3没有完成,但我再次调用它们,该怎么办。我是否在新的线程中启动这些函数?在一些调用之后,是否有x线程同时运行function1()?我想知道这真的很健康

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


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

你看过任务了吗

你可以这样做:

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);
以上内容将允许您并行运行这些函数,这就是您想要的


如果您不想在等待所有任务完成的
计时器1_Tick
内阻塞,然后,不要使用WaitAll…相反,当计时器再次触发时,您可以通过检查任务上的IsCompleted来检查任务是否已完成…然后决定是否发出下一批函数。

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

Task.Factory.StartNew(() =>
{
    function1();
    function2();
    function3();
});
如果我的计时器设置为5秒,5秒后功能1、2和3未完成,该怎么办


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

使用
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);
}

并行执行与串行执行相反。第一个示例有什么问题?根据上一段,听起来您不希望它们并行运行,因为听起来3取决于2标识文件,2取决于1移动文件。这是准确的吗?我认为最好是平行进行。如果function3已经可以向某人发送文件,但function3无法运行,因为function1仍在执行某些操作,该怎么办?或者说,可能有100000个文件供function1复制。现在,即使有5000个文件准备好执行下一个任务,function2也必须等待,直到function1处理完这100000个文件。
// 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);
}