c# - 每 n 毫秒执行 x 个 Action

标签 c# multithreading action

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

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

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

   Thread.Sleep(x);
}

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

简而言之 我想每 n 毫秒执行 x 个 Action ……创建这种算法的最佳方法是什么?例如,如果我有 3 个操作,我想每 200 毫秒执行第一个操作,每 500 毫秒执行下一个操作,每 1000 毫秒执行最后一个操作。

也许我需要类似于 javascript 中的 SetTimout 函数的东西

最佳答案

如果您使用的是 .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);
}

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

.NET 运行时会自动处理线程调度,但不能保证您的操作会在恰好请求的超时后执行。它将至少在该时间过去并且有可用的空闲线程后执行。

关于c# - 每 n 毫秒执行 x 个 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954076/

相关文章:

c# - e.cancel = true 后后台worker不会运行 "RunWorkerCompleted";

ruby-on-rails - rails : configuring a form action's host using custom URL from settings

wordpress - ACF - 选项页面 Hook (Wordpress)

C# WPF 附加属性 - 错误 : "The property does not exist in XML namespace"

c# - 在 Visual Studio Code 中引用 DLL

c# - WPF更新ContainerStyleSelector样式选择

c# - 如何从 Swagger UI 中排除某些模型

multithreading - JMeter一次只对全局变量进行初始化

c# - C# 中类似 Java 的线程同步

java - 组合表单和选择