我有一个程序,我让用户创建几个函数,一旦他创建了所有函数,我就每 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/