在间隔异步中并行运行一些函数?

时间:2012-09-18 07:13:05

标签: c# .net timer thread-safety

我有一个Timer,我在一个间隔中调用一些函数。现在我有这样的事情:

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()需要的时间比interval长,所以其他功能也必须等待。如果我删除那里的sync,其他函数将不会等待但另一个function4()调用可以在另一个线程中启动 - 我不希望一个函数运行两次。有什么建议?谢谢

1 个答案:

答案 0 :(得分: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(); }
                    ...
    ...
}

这样的东西会阻止任何已经执行的函数,并允许其他函数启动而不是。