我需要一个等效的计时器,它会定期执行一些特定的操作(例如更新数据库中的一些进度或检查要在数据库中执行的新作业)。
这些操作绑定到一个 WaitHandle,它指定是否需要执行作业。所以基本上这可能是,例如,当数据库中有一个新实体并触发对这些新实体的搜索时,从外部设置一个 AutoResetEvent。计时器是必要的,因为我想限制对数据库的查询次数。因此,如果有 10 个新通知到达,则 AutomaticResetEvent 将只设置一次,并且所有这些也只有一个查询。
我的第一次尝试如下所示:
class ConditionalScheduler
{
public void AddConditionalAction(WaitHandle handle, Action action)
{
lock (syncRoot)
{
handles.Add(handle);
actions.Add(handle, action);
}
}
private readonly object syncRoot = new object();
private readonly Dictionary<WaitHandle, Action> actions = new Dictionary<WaitHandle, Action>();
private readonly List<WaitHandle> handles = new List<WaitHandle>();
public void RunTimerLoop()
{
do
{
WaitHandle[] waitHandles = handles.ToArray();
int index = WaitHandle.WaitAny(waitHandles);
if (index >= 0)
{
WaitHandle handle = waitHandles[index];
Action action;
lock (syncRoot)
{
action = actions[handle];
}
action();
}
Thread.Sleep(5000);
} while (true);
}
这种方法的问题是 WaitHandle.WaitAny 只会给我触发的第一个 WaitHandle 的索引。因此,如果我有 2 个或更多 WaitHandles 被触发,那么我将只执行第一个操作而不执行其他操作。
您是否有更好的设计来实现执行在指定时间段内触发的所有操作所需的结果?如果它简化了问题,我可以使用另一种通知机制而不是 WaitHandles。
谢谢!