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
,这是我的错误。好的!然后一切都很顺利:)再次谢谢你,最后没那么难。