C# 以异步间隔并行运行某些函数?

C# 以异步间隔并行运行某些函数?,c#,.net,timer,thread-safety,C#,.net,Timer,Thread Safety,我有一个计时器,我每隔一段时间调用一些函数。现在我有这样的事情: 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,

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

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

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

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(); }
                    ...
    ...
}

类似这样的操作会阻止任何已经执行的函数,并允许其他未执行的函数启动。

谢谢。不确定我是否100%理解这一点:),但我将尝试实现这一点。@silla一次只能调用
FunctionX
,但它不应阻止其他调用。因此,基本上发生的事情是,您为所有4个函数启动一个并行调用,我们阻止
FunctionX
的执行,如果它已经通过
WaitOne
运行。一旦
FunctionX
在另一个线程中完成,它将调用
Set
,然后释放块并允许另一个线程执行
FunctionX
。我很困惑,但您确定我必须使用新的AutoResetEvent(false);而不是新的自动存储事件(true);?因为如果我使用false,则没有函数正在运行,但如果使用true,则它们正在运行。@silla很抱歉,您是正确的,它们应该默认为
true
,这是我的错误。好的!然后一切都很顺利:)再次谢谢你,最后没那么难。