作为一个快速的解决方案,我可以建议保留一个委托列表以及您要在每个计时器滴答时调用的方法。因此,在用户操作中,您只需添加要调用的方法。如果每个用户调用的参数必须是唯一的,您可以执行以下代码中的操作:
// This is the class handling the timer ticks
public class ActionExecutor : IDisposable
{
private Timer timer;
private IList<Action> actionsList = new List<Action>();
public ActionExecutor()
{
// choose the interval as suits you best, or use
// constructor argument
timer = new Timer(1000);
timer.Elapsed += OnTimerTick;
timer.AutoReset = true;
timer.Start();
}
void OnTimerTick(object sender, ElapsedEventArgs)
{
lock(actionsList)
{
foreach(Action a in actionsList)
{
a();
}
actionsList.Clear();
}
}
public void AddAction(Action a)
{
lock(actionList)
{
actionList.Add(a);
}
}
public void Dispose()
{
// we must stop the timer when we are over
if (timer != null)
{
timer.Stop();
}
if (actionList != null)
{
actionList.Clear();
}
}
~ActionExecutor()
{
Dispose();
}
}
//handling user click in your application
void OnUserClick()
{
// built the specific notification request
NotificationMessageRequest request = ...
actionExecutor.AddAction(() => SendNotificationMessage(request));
}
在上面的代码中,您必须确保使用ActionExecutor
处理用户操作的同一实例。请注意与锁的同步 - 计时器通常在单独的线程中运行,而不是添加操作的线程。如果您说的是 Web 应用程序,那么每个用户都在他/她自己的线程中运行,因此多个用户同时也会增加并发性。此外,您可能必须添加适当的错误处理,因为为简洁起见,我省略了该部分。
更新
正如评论中所建议的,您可能会受益于使用与列表不同的集合来保存操作。这取决于您的场景的实际需求。