如何让Win服务长时间运行线程我有一个win服务托管一些我需要长时间运行的工作流(WorkflowApplication和WorkflowServiceHost)。因为OnStart()需要它完成并返回到操作系统,所以我有一个main方法可以触发线程池中的另一个线程。我的Onstart()主程序看起来像这样protectedoverridevoidOnStart(string[]args){eventLog.WriteEntry("Servicestarting...");ThreadPool.QueueUserWorkItem(newWaitCallback(ServiceMainThread));线程.睡眠(100);eventLogCms.WriteEntry("服务已启动。");ServiceMainThread()是我的工作流执行和实现核心功能的方法。当我在Windows7机器上启动该服务时,它会运行并在大约8分钟后停止运行。在WinServer2008上,线程从不执行。所以我认为我错误地实现了线程,并且ServiceMainThread有问题。由于我是threading.Net的新手,所以我乐于接受关于可以改进什么或任何方向的建议。ServiceMainThread中的基本线程代码编码如下:while(alive){Thread.Sleep(1);//...检查工作流状态并确保它们仍在执行...}//..停止工作流执行并在必要时执行持久操作..eventLog.WriteEntry("Workflowshalted.");这是我对OnStop()的实现:protectedoverridevoidOnStop(){alive=false;这个.haltEvent.WaitOne();//haltEvent是ManualResetEvent类型的}是否有任何明显的变化使我的工作流程长期保持在执行状态?while循环似乎有点太老套了(更不用说我不喜欢延迟线程任何时间)而且我相信可能有更好的解决方案。使用线程而不是线程池确实会启动,但它似乎允许工作流在执行开始前运行2分钟,现在停止,但我想我可以更正OnStop()。当我这样做时,我将ServiceMainThread()中的while循环设置为一个空块,因此它不会阻塞正在执行工作流的线程。更新:我在事件日志中从.Net得到这个异常:框架版本:v4.0.30319描述:由于未处理的异常,进程被终止。异常信息:System.NullReferenceException堆栈:在Ptm.ServiceMainThread()在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object)atSystem.Threading.ThreadHelper.ThreadStart()Server2008是64位,是否与我的问题有关?首先,对于长时间运行的线程,创建自己的Thread对象并启动它;不要使用线程池。线程池专为小型、相对短暂的操作而设计。其次,有几种方法可以使您的线程保持活动状态。您尝试过的最基本的是while循环,最后有一个睡眠(或其他阻塞)调用。这是最低限度,但不一定是“最佳”。还有其他选项,例如可以从其他应用程序访问的名为WaitHandle的对象,它们允许更确定的代码执行和更少的唤醒-检查-睡眠迭代。但是,如果您不能(或不想)修改其他进程以支持将特定事件通知您的服务,那么您所拥有的基本上是正确的。但是,我会鼓励选择更合理的睡眠时间;你真的需要每毫秒检查一次吗?我通过让OnStart()启动System.Timers.Timer并在计时器的ElapsedEventHandler中进行所有处理来解决长时间运行的Windows服务的问题。在处理程序中,我停止计时器,在单独的线程上执行工作,检查暂停信号,然后在可以继续时重新启动计时器。该服务的OnStop()方法停止计时器并终止所有活动的工作线程。工作线程处理所有异常,因此如果出现问题,它会记录异常、终止并在下一个计时器间隔重新启动。服务核心从未崩溃。关于阻塞,您应该使用等待/脉冲编程范例来通知线程继续。或者只是加入线程。Wait&Pulse–C#中的线程以上就是C#学习教程:如何让Win服务长时间运行的线程共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
