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

WindowsService中如何在没有Timer的情况下循环共享

时间:2023-04-11 00:13:56 C#

.NET完成)调用业务层方法。但是,我不想使用Timer_Elapsed事件,因为如果第一个线程/进程仍在运行,它会启动另一个线程/进程。我只需要一个单线程方法,因为多次调用同一个业务方法会产生不必要的复杂性。所以我在on_start中添加了一个do-while循环。我知道这不是正确的方法,因为它会生成进程,如果服务关闭,它就会变成孤儿。我该如何处理这个问题?问候,Chak还有另一种获取定时执行的方法,WaitHandle.WaitOne()方法提供了一个超时参数。这在服务中非常有效,因为它允许您在单个方法调用中同时实现停止服务和定期执行服务。模板看起来像这样:ThreadWorker;AutoResetEventStopRequest=newAutoResetEvent(false);protectedoverridevoidOnStart(string[]args){//启动工作线程Worker=newThread(DoWork);工人.开始();}protectedoverridevoidOnStop(){//通知worker停止并等待它执行StopRequest.Set();工人.加入();}privatevoidDoWork(objectarg){//工作线程循环for(;;){//每10秒运行一次此代码,或者如果服务停止则立即停止//if(StopRequest.WaitOne(10000))return;//工作...//...}}使用计时器,但只要输入计时器处理程序方法就禁用计时器,这样就不会再引发任何事件。在退出处理程序之前,重新启用计时器。看看这个讨论,尤其是jsw的回答。它提出了一种同步机制来防止对业务逻辑的多个同时调用。由于处理程序是在单独的线程上调用的,因此无法保证在Elapsed处理程序方法中禁用计时器会阻止并行调用。按照jsw的建议使用锁定,并在同步代码块中停止计时器。或者,您可以使用Timer并将AutoReset属性设置为false。这样,Elapsed事件只会引发一次,您可以手动重置计时器,直到处理程序方法结束。以上就是C#学习教程的全部内容:如何在不使用Timer的情况下在Windows服务中进行循环共享。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——while(true){..dosomethingThread.睡觉(某个时间或一天);线程线程;privatevoidDoWork(objectarg){while(true){//每20秒运行一次此代码,如果服务停止则停止try{Thread.Sleep(20000);//做工作....}catch(ThreadInterruptedException){return;}}}protectedoverridevoidOnStart(string[]args){//启动线程thread=newThread(DoWork);mWorker.Start();}protectedoverridevoidOnStop(){//中断线程并等待它执行thread.Interrupt();线程.加入();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: