4

我有一个计时器,我在一段时间内调用了一些函数。现在我有这样的事情:

private System.Timers.Timer timer;
private int sync;

void Start()
{
  timer = new System.Timers.Timer(interval);
  timer.Elapsed += new ElapsedEventHandler(Elapsed);
  timer.Enabled = true;
}

void Elapsed(object s, ElapsedEventArgs e)
{
  if (System.Threading.Interlocked.CompareExchange(ref sync, 1, 0) == 0)
  {
    Parallel.Invoke( () => Function1(), () => Function2(), () => Function3(),
                     () => Function4() );
  }
  sync = 0;
}

这还不错。我可以并行启动功能,并且一个功能不能运行 2 次以上,只能运行一次(这就是我想要的方式)。问题是:假设比function4()my 需要更长的时间interval,所以其他功能也必须等待。如果我删除sync那里,其他函数不会等待但另一个function4()调用可以在另一个线程中启动 - 我不希望一个函数运行两次。有什么建议么?谢谢

4

1 回答 1

3

您必须单独跟踪每个功能,以便控制可以立即启动哪些功能以及需要等待哪些功能,例如

private AutoResetEvent f1 = new AutoResetEvent(true);
private AutoResetEvent f2 = new AutoResetEvent(true);
...

void Elapsed(object s, ElapsedEventArgs e)
{
    ...
    Parallel.Invoke(() => { f1.WaitOne(); Function1(); f1.Set(); },
                    () => { f2.WaitOne(); Function2(); f2.Set(); }
                    ...
    ...
}

这样的事情会阻止任何已经在执行的函数,并允许其他没有启动的函数。

于 2012-09-18T07:58:15.537 回答