我想知道我编写的代码是否是正确编写的代码,是否可以正常工作,但是我之前做过糟糕的设计,所以我需要知道我是否以适当的方式考虑了这一点。代码是关于使用System.Timers.Timer每X个小时执行一次重复操作。我在stackoverflow上阅读了有关此主题的一些线程,然后尝试编写自己的类。这是我写的:namespace MyTool{public class UpdaterTimer : Timer{ private static UpdaterTimer _timer; protected UpdaterTimer() { } public static UpdaterTimer GetTimer() { if (_timer == null) _timer = new UpdaterTimer(); SetTimer(_timer); return _timer; } private static void SetTimer(UpdaterTimer _timer) { _timer.AutoReset = true; _timer.Interval = Utils.TimeBetweenChecksInMiliseconds; _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); _timer.Start(); DoStuff(); } static void _timer_Elapsed(object sender, ElapsedEventArgs e) { DoStuff(); } private static void DoStuff() { //does stuff on each elapsed event occurrence }}}简短的介绍:尝试使用单例模式,因为我只需要一个计时器即可工作我不确定在SetTimer()方法中调用DoStuff(),这似乎是多余的。但是逻辑是,当应用程序启动时,DoStuff()必须运行,然后必须在每个Timer.Elapsed事件上再次运行。我的问题是:根据规范,您是否会以其他方式编写此行为?在这种情况下可以使用单例,还是没有意义? 最佳答案 我不知道您要达到什么目的,但以下是您当前设计的几点:您的GetTimer在多线程模式下已损坏:if (_timer == null) _timer = new UpdaterTimer();假设您有两个线程,每个线程同时调用GetTimer,第一个线程检查_timer并发现它为null,以便继续进行。但是在那时和到达_timer = new UpdateTimer()之前,线程上下文切换切换到另一个线程并暂停当前线程执行。因此,另一个线程检查_timer并发现它不为null,以便继续进行操作并创建一个新计时器,现在上下文切换重新安排了第一个线程并继续执行它,因此创建了一个新计时器并更新了旧计时器。正确使用单例模式,请使用静态构造函数代替static UpdaterTimer() { _timer = new UpdaterTimer();}开发人员可以随意调用GetTimer(),因此它将再次调用_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);来注册另一个Elapsed处理程序。另请注意,无论何时调用GetTimer,即使计时器已停止,计时器也会启动“ _timer.Start()”。不要返回基础计时器,而应公开公共方法Start(),Stop(),UpdateInterval(int interval)。在SetTimer()处,您想立即调用DoStuff,但是在SetTimer方法等待DoStuff()完成时,它将被阻塞,更好的方法是在新线程ThreadPool.QueueUserWorkItem(new WaitCallback((_) => DoStuff()));中启动该方法或使用代替System.Timers.Timer并进行设置,以立即启动方法。关于c# - 正确使用Timer类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6738765/
10-08 22:04