每n毫秒执行x个动作

Ton*_*Nam 2 c# multithreading action

我有一个程序,我让用户创建几个函数,一旦他创建了所有函数,我每隔x毫秒运行一次.换句话说,我有类似的东西:

// functionsToExecute is of type = List<Action>
// x = some integer
while(true){

   foreach(Action action in functionsToExecute)
   {
       action();
   }

   Thread.Sleep(x);
}
Run Code Online (Sandbox Code Playgroud)

现在我想让用户决定每个功能等待多长时间.例如,如果用户创建了2个函数,他可能希望第一个函数每1500毫秒运行一次,每1500个下一个函数.我正在考虑为这个场景创建两个线程,然后实现相同的.但是如果用户创建了50个功能呢?我需要50个线程!

总之,我想每n毫秒执行一次x次动作......创建这种算法的最佳方法是什么?例如,如果我有3个动作,我将每200毫秒执行第一个动作,下一个每500毫秒执行一次,最后一个每1000毫秒执行一次.

也许我需要类似于SetTimoutjavascript中的函数

Mar*_*lig 5

如果您使用的是.NET 4.5并且您的代码不是时间关键的,那么您可以使用任务并行库轻松完成此任务:

static Task Repeat (List<Action> actions, CancellationToken token, int delay)
{
    var tasks = new List<Task> ();
    var cts = CancellationTokenSource.CreateLinkedTokenSource (token);

    foreach (var action in actions) {
        var task = Task.Factory.StartNew (async () => {
            while (true) {
                cts.Token.ThrowIfCancellationRequested ();
                await Task.Delay (delay, cts.Token).ConfigureAwait (false);
                action ();
            }
        });
        tasks.Add (task);
    }

    return Task.WhenAll (tasks);
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,您还应该使您的操作异步以正确支持取消.

.NET运行时自动处理线程调度,但无法保证在完全请求的超时后执行您的操作.它将在至少经过一段时间后执行,并且有一个空闲线程可用.