需要:从数据库中的作业队列执行作业的Windows服务;需要:需要示例代码:需要:背景:重要:但我需要从头开始编写此服务。我只想提前知道我需要考虑什么。编辑:我最担心的是失败的工作、竞争工作以及保持服务运行。鉴于您正在处理数据库队列,由于数据库的事务性质,您可以公平地完成已经完成的工作。典型的队列驱动应用程序有一个循环:while(1){Starttransaction;从队列中取出项目;处理项目;保存项目的新状态;犯罪;如果处理中途崩溃,事务将回滚,下次服务开始处理该项目。但是在数据库中编写队列实际上比您想象的要复杂。如果您部署一种天真的方法,您会发现您的入队和出队相互阻塞并且ashx页面变得无响应。接下来你会发现dequeue和dequeue死锁了,你的循环经常遇到1205错误。强烈推荐你阅读这篇用表做队列的文章。您的下一个挑战是使汇集率“恰到好处”。过于激进,您的数据库将因汇集请求而变得炙手可热。太麻烦了,你的队列会在高峰时间增长并且排得太慢。您应该考虑一种完全不同的方法:使用SQLServer的内置QUEUE对象并依赖WAITFOR(RECEIVE)语义的魔力。这允许完全无轮询的自调整服务行为。实际上,还有更多:您不需要启动服务。有关我正在谈论的内容的解释,请参阅异步进程执行:以完全可靠的方式从Web服务调用开始在SQLServer中异步处理。最后,如果逻辑必须在C#进程中,那么您可以利用外部激活器,它允许在单独的进程而不是T-SQL进程中托管处理。首先,您需要考虑多久轮询一次您的服务是停止和启动还是支持暂停和恢复。同时。服务可能会增加遇到执行问题的可能性使用System.Timers.Timer而不是Threading.TimerMaker确保将Timer.AutoReset设置为false。这将防止重入问题。确保包括执行时间这是所有这些想法的基本框架。它包含一种调试方法,这是一种痛苦publicpartialclassService:ServiceBase{System.Timers.Timertimer;publicService(){timer=newSystem.Timers.Timer();//当autoreset为True时存在重入问题timer.AutoReset=false;timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(DoStuff);}privatevoidDoStuff(objectsender,System.Timers.ElapsedEventArgse){Collectionstuff=GetData();LastChecked=DateTime.Now;foreach(东西中的对象项){try{item.Dosomthing()}catch(System.Exceptionex){this.EventLog.Source="SomeService";this.EventLog.WriteEntry(ex.ToString());这个。停止();}TimeSpants=DateTime.Now.Subtract(LastChecked);TimeSpanMaxWaitTime=TimeSpan.FromMinutes(5);如果(MaxWaitTime.Subtract(ts).CompareTo(TimeSpan.Zero)>-1)timer.Interval=MaxWaitTime.Subtract(ts).TotalMilliseconds;否则定时器.Interval=1;定时器。开始();}protectedoverridevoidOnPause(){base.OnPause();这个定时器停止();}受保护的覆盖voidOnContinue(){base.OnContinue();这个.timer.Interval=1;这个。计时器。开始();}protectedoverridevoidOnStop(){base.OnStop();这个定时器停止();protectedoverridevoidOnStart(string[]args){foreach(args中的字符串arg){if(arg=="DEBUG_SERVICE")DebugMode();}#ifDEBUGDebugMode();#endiftimer.Interval=1;定时器。}privatestaticvoidDebugMode(){Debugger.Break();编辑Start()中的固定循环编辑结果毫秒与TotalMilliseconds不同您可能想看看Quartz.Net来管理作业的调度不确定它是否适合您的特定情况,但值得一看。根据您的编辑,我可以想到一些事情:回复:工作失败:回复:争用:回复:保持服务运行我真的只是在黑暗中闲逛。我强烈建议对服务进行原型设计并回答有关其工作原理的任何具体问题。以上是C#学习教程:必填:从数据库中的作业队列执行作业的Windows服务;通缉:示例代码分享的全部内容,如果对大家有用,还需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场.如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
