当前位置: 首页 > 编程语言 > C#

我应该阻止共享

时间:2023-04-10 21:19:24 C#

尽管我正在按顺序处理,但我有一个Windows服务需要定期执行一些工作。所以我设置了一个System.Timers.Timer来执行此操作。假设处理时间可能大于计时器间隔。让我们假设如果发生这种情况将是一件非常糟糕的事情。为避免这种情况,我将Timer上的AutoReset设置为false,然后在我的进程中调用start。publicpartialclassService:ServiceBase{System.Timers.Timer定时器;publicService(){timer=newSystem.Timers.Timer();//当autoreset为True时存在重入问题timer.AutoReset=false;timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(DoStuff);}protectedoverridevoidOnStart(string[]args){timer.Interval=1;定时器。开始();}privatevoidDoStuff(objectsender,System.Timers.ElapsedEventArgse){Collectionstuff=GetData();LastChecked=DateTime.Now;foreach(东西中的对象项){item.Dosomthing();//Dosomthingshouldonlybecalledonce}TimeSpants=DateTime.Now.Subtract(LastChecked);TimeSpanMaxWaitTime=TimeSpan.FromMinutes(5);如果(MaxWaitTime.Subtract(ts).CompareTo(TimeSpan.Zero)>-1)timer.Interval=MaxWaitTime.Subtract(ts).TotalMilliseconds;否则定时器.Interval=1;定时器。开始();}目标前代码没有阻止,因为我知道是由于AutoReset=false,它被顺序处理。但是我可以这样做lock(myLock){Collectionstuff=GetData();LastChecked=DateTime.Now;foreach(东西中的对象项){item.Dosomthing();//Dosomethingshouldonlybecalledonce}}编辑:为了澄清我的问题,我将服务设计为单线程的,所以我不需要锁。如果我添加锁定,我仍然在我的性能预算之内,所以性能不是原因。基本上,我正在权衡两个方面,并试图弄清楚什么是正确的事情?。在“无锁”方面,我依赖于我的设计来保证代码的正确性。在“锁定”方面,我会添加不必要的代码。哪个更好?我要么全是为了线程安全,要么根本就没有线程安全,只要在文档中写得很清楚该类不是线程安全的。最糟糕的事情是多年后回来,却不记得一切是否安全。然后你最终会浪费大量时间研究你的代码,或者更糟的是,你最终会误导自己。仅当多个线程将使用对象时才需要锁。在您的情况下,您的设计可以防止这种情况发生,因此不需要锁定。在这种情况下,添加锁的唯一真正好处是可以防止以后更改调度算法时出现问题。就像其他人所说的那样,如果它是单线程的,则不需要锁定。还有,大家可以一起跳过timer:以上是C#学习教程:即使我是按顺序做的,如果对大家有用,需要进一步了解C#,我也应该把分享的全部内容屏蔽掉学习教程,希望大家喜欢Follow—TimeSpanmaxInterval=newTimeSpan(0,10,0);while(true){DateTimestartTime=DateTime.UtcNow;//做很多很多工作TimeSpants=DateTime.UtcNow-startTime;ts=(ts>maxInterval?newTimeSpan(0):maxInterval-ts);线程.睡眠(ts);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: