gpt4 book ai didi

c# - 以不同间隔运行的并行循环

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:36 25 4
gpt4 key购买 nike

在 C# 中,我试图创建一个 Windows 服务,其中包含两个循环,它们将按设定的时间间隔同时运行。例如,LoopA 将每 30 秒运行一次,而 LoopB 每 5 秒运行一次。

将在 LoopA 内发生的任务可能需要 30 多秒才能完成。如果发生这种情况,LoopA 将立即重新开始,如果任务只需要 20 秒,LoopA 将在 10 秒内不会再次运行。

我已经实现了 LoopA。我现在的问题是实现 LoopB 并行运行,其行为方式与 LoopA 相同,但间隔为 5 秒。这是我的 LoopA 代码,它在线程内运行:

private Thread Worker;
private AutoResetEvent StopRequest;

private TimeSpan loop_a_freq;
private TimeSpan loob_b_freq;

public LoopManager(Thread _worker, AutoResetEvent _stopRequest)
{
// Threads
this.Worker = _worker;
this.StopRequest = _stopRequest;

RunLoopA();
}

private void RunLoopA()
{
DateTime start_current_loop = DateTime.Now;
DateTime next_loop = start_current_loop + loop_a_freq;

for (;;)
{
// Do processing here
new LoopAction();

DateTime now = DateTime.Now;
if (now > next_loop)
{
next_loop = now;
}

TimeSpan delay = next_loop - now;
Thread.Sleep(delay);

next_loop += loop_a_freq;

if (StopRequest.WaitOne(0))
{
return;
}
}
}

我该如何着手实现 RunLoopB()?线程是我从未完全探索过的 C# 的一个方面。我需要使用 Parallel.For() 吗?

最佳答案

这是一个小片段,您可以将其放入 linqpad 并进行测试。这将防止计时器重叠。基本上我们执行回调,停止计时器,处理一些工作,重置计时器并再次启动它。您的每个定时任务都需要一个计时器。

需要明确的是,这将防止您的线程不必要地排队,因为您只是创建一个新线程来处理另一个线程完成后的工作。拥有 2 个计时器将允许您以不同的时间间隔运行 2 个不同的进程,从而创建它们自己的线程。同样,每个计时器只允许每个进程发生一个实例。

基本流程

  1. 在构造函数中设置没有间隔的定时器
  2. 开始计时
  3. 计时器等待,然后在经过时在新线程上启动进程
  4. 进程停止计时器
  5. 流程确实有效
  6. 进程设置间隔以重置计时器(由于“AutoReset”属性)
  7. 进程启动计时器
  8. 从第 3 步开始重复

基本代码

private System.Timers.Timer _timer;
private int _delaySeconds = 5;

void Main()
{
// timer prevents threads from overlapping modify with care
_timer = new System.Timers.Timer();
_timer.Interval = _delaySeconds*1000;
_timer.AutoReset = true; // important to prevent overlap
_timer.Elapsed += OnProcess;

_timer.Start();
}

private void OnProcess(object sender, System.Timers.ElapsedEventArgs args)
{
// timer prevents from thread overlapping modify with care
_timer.Stop();

// do work
Debug.WriteLine("Processing on thread. [{0}]", Thread.CurrentThread.ManagedThreadId).Dump("this");

// setting the interval resets the timer
_timer.Interval = _delaySeconds*1000;
_timer.Start();
}

性能故障排除

此外,我昨天发现这篇文章可能对您诊断线程性能有帮助。

http://msdn.microsoft.com/en-us/library/ee329530.aspx

关于c# - 以不同间隔运行的并行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com