我有一个可以快速连续发生的事件的事件处理程序。在某些情况下,当事件再次触发时(毫秒内),处理程序仍将执行。
有没有让这些处理程序...连续?那么,在事件调用#1完成之前,事件调用#2才能启动?
如果这是一个糟糕的想法,为什么?这是一个在后台无人值守运行的批处理过程,所以我并不十分关注一个调用阻塞另一个调用的性能问题。
答案 0 :(得分:3)
使用多线程控制lock
。这可以防止您的代码在同一时间运行一次。
<强> EDITED 强>
实施例:
public class Foo
{
private static object _lockKey = new object();
private void YourEventHandlerMethod(object sender, EventArgs e)
{
lock (_lockKey)
{
// the code you put inside this block will be execute only
// once at time.
// If a second call has the intention to use this block before
// the conclusion of the first call, the second call (the thread)
// will be put in hold.
}
}
}
答案 1 :(得分:0)
有一些选项可以序列化事件的处理,这些事件可以从多个线程同时触发,或者通过re-enrancy / recursion在同一个线程上触发。
其中一个选项是使用任务计划程序。在您的方案中,任务调度程序的目的是对回调进行排队以便以后进行串行执行。众所周知的任务调度程序的概念性示例是WinForms消息循环(以Application.Run
开头,使用Control.BeginInvoke
排队)和WPF Dispatcher循环(以Dispatcher.Run
开头,排队{{1} }或Dispatcher.BeginInvoke
)。
Stephen Toub对TPL任务调度程序的一个知之甚少但非常有用的实现是StaTaskScheduler
。我发布了一些基于here和here的代码(后者来自一个密切的问题Queuing Actions/Delegates for Asyncronous Execution)。
此处描述了另一个选项:Task sequencing and re-entracy。
在这种情况下,处理程序组成任务,每个新处理程序在上一个任务完成时启动。