我有一个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()
调用可以在另一个线程中启动 - 我不希望一个函数运行两次。有什么建议?谢谢
答案 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(); }
...
...
}
这样的东西会阻止任何已经执行的函数,并允许其他函数启动而不是。