本篇文章给大家谈谈处理Windows服务停止/暂停请求期间的延迟,以及windows暂停服务是什么意思的知识点,同时本文还将给你拓展.net–如何在服务停止的多线程Windows服务中停止工作线程、c
本篇文章给大家谈谈处理Windows服务停止/暂停请求期间的延迟,以及windows暂停服务是什么意思的知识点,同时本文还将给你拓展.net – 如何在服务停止的多线程Windows服务中停止工作线程、c# – System.Transactions中的未处理异常在网络不稳定期间停止Windows服务、c# – 停止Windows服务时出错、c# – 正常处理Windows服务的关闭等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 处理Windows服务停止/暂停请求期间的延迟(windows暂停服务是什么意思)
- .net – 如何在服务停止的多线程Windows服务中停止工作线程
- c# – System.Transactions中的未处理异常在网络不稳定期间停止Windows服务
- c# – 停止Windows服务时出错
- c# – 正常处理Windows服务的关闭
处理Windows服务停止/暂停请求期间的延迟(windows暂停服务是什么意思)
我有一个从ServiceBase派生的Windows服务类,它使用System.Timers.Timer以频繁的间隔运行代码。 OnStop和OnPause处理程序使用一些信号与定时器线程一起检查定时器是否仍在运行并等待它结束。
在这种情况下是否有推荐的处理延迟错误的方法,例如处理程序是否在等待计时器线程停止的不可接受的长时间?
我应该继续等待,直到SCM放弃(但是这将使服务进入一种状态,除了杀死进程之外,对服务不能做任何事情,有时候重启是唯一的方法)。 或者我可能会抛出一个exception(这会使其处于类似的状态,还是放弃停止/暂停请求)?
如果我可以拒绝暂停/停止的请求,并让SCM将其保留在用户可以尝试暂停/再次停止的状态,我宁愿这样做。 我可以中止计时器线程,但是有时它会locking在其他资源上,我宁愿等待直到完成,并且只有在pipe理员能够稍后尝试停止时logging错误。
C#,C ++,WinAPI – 获取另一个进程的窗口数
使用与DLL相同的EXE应用程序到其他应用程序
将消息发送到Windows GUI线程
如何在一个或多个for循环中使用现有的variables?
写入Windows应用程序事件日志,无需注册事件源
如何以编程方式检查WCF Http / Non-Http Activation组件?
从主function最大化窗口?
Silverlight VS. WPF VS. Winforms特别是我的目的有什么好处?
以编程方式获取Windows体验索引值
哪个.net版本的Windows 10内置
您可以使用RequestAdditionalTime方法通知SCM您需要更多时间来停止/暂停您的服务。
我反对SCM放弃了我的头,导致我的服务像在六月份在南极洲晒日光浴一样冻结起来。
对我而言,问题在于服务做了一些处理,可能会花费比SCM更愿意等待响应停止请求的时间。
我喜欢我的软件开始/退出/暂停,甚至优雅地死亡。
我实现的解决方案是使用配置文件。 我把一个ExecutionMode参数在文件中。 在每个处理循环开始时,它检查配置文件 – 如果ExecutionMode是暂停或停止 ,则执行代码来改变状态,并使用SMTP向ServiceChangeNotification参数中列出的电子邮件ID发送电子邮件。 电子邮件中包含的机器名称,时间戳,服务名称,旧状态,旧状态开始时间,当前状态,当前状态开始时间,日志详细信息。
.net – 如何在服务停止的多线程Windows服务中停止工作线程
我的问题是处理服务停止以优雅地结束对这些工作线程的处理的最佳方式.我已经读过另一个SO question,使用thread.Abort()是坏的设计的标志,但似乎服务OnStop()方法只有在服务终止之前完成有限的时间.我可以在ThreadAbortException的catch中进行足够的清理(没有不一致状态的危险),所以调用thread.Abort()在工作线程上似乎对我来说很好.是吗?什么是替代品?
解决方法
我会尝试在我的队列中发出一个“冲洗和退出”的信号 – 很像“关闭”方法here,但是在完成时有一些信号.
如果你诉诸中止 – 认为这个过程是致命的.尽快杀死它
c# – System.Transactions中的未处理异常在网络不稳定期间停止Windows服务
在过去几个月中,Windows服务突然停止了两次生产,在应用程序事件日志中留下了以下事件:
Application: NServiceBus.Host.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: system.invalidOperationException
Stack:
at System.Transactions.TransactionState.ChangeStatePromotedPhase0(System.Transactions.InternalTransaction)
at System.Transactions.Phase0VolatileDemultiplexer.InternalPrepare()
at System.Transactions.VolatileDemultiplexer.PoolablePrepare(System.Object)
at System.Transactions.Oletx.OletxVolatileEnlistment.Prepare(System.Transactions.Oletx.OletxVolatileEnlistmentContainer)
at System.Transactions.Oletx.OletxPhase0VolatileEnlistmentContainer.Phase0Request(Boolean)
at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object,Boolean)
at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object,Boolean)
我们在网络不稳定几分钟的时间段内遇到此错误(例如,针对数据库的大量超时,这些在我们的log4net日志文件中可见)
关于什么在这里失败的任何想法?
我们在log4net日志文件中看不到任何致命错误.
版本:
> Windows Server 2008 R2
> .NET Framework 4.5.2
> NServiceBus 4.7.5
> NHibernate 3.3.3.4001(用于传奇,订阅和超时持久性)
> sql Server 2012
解决方法
TransactionCompleted
事件有关.这个问题也是某种方式
related to this question.
AdoNetWithdistributedTransactionFactory在TransactionCompleted事件上注册匿名委托.使用ThreadPool.QueueUserWorkItem在后台线程上触发此事件.如果该操作因数据库服务器的连接问题而引发异常(i.ex.由于网络分区),则此异常将作为AppDomain上的未观察异常引发. UnhandledExceptions会拆除AppDomain,因此也会拆除NServiceBus.Host.
最好的解决方法是在当前AppDomain上注册UnhandledException处理程序,如下所示
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException private static void OnUnhandledException(object sender,UnhandledExceptionEventArgs e) { LogManager.GetLogger(typeof(AppDomain)).Fatal(“Unhandled exception”,e.ExceptionObject as Exception); }
更多信息see
当这解决了中间问题时,找到与NHibernate结合的数据库服务器连接问题的根本原因是有意义的
c# – 停止Windows服务时出错
Windows Could not stop the xxx service on Local Computer.
The service did not return an error. This Could be an internal Windows error or an internal service error.
If the problem persists,contact your system administrator.
如果我再次尝试停止它,它需要很多时间,然后抛出错误如下:
Windows Could not stop the xxx service on Local Computer.
Error 1061: The service cannot accept control messages at this time.
此时,服务已停止.但是如果我尝试重新安装该服务,它会引发另一个错误:
Windows Could not stop the xxx service on Local Computer.
Error 1001: The specified service is marked for deletion.
在关闭services.msc之后,它可以让我重新安装服务,再次,事情开始工作正常.
在OnStop()中,我做了一些冗长的操作,需要时间才能完成.
有什么想法可以让整个事情顺利进行吗?
– 编辑 –
这是我的OnStop方法的样子:
protected override void OnStop() { base.OnStop(); //Some lengthy operation }
解决方法
通常,Windows服务中的OnStart以及OnStop事件用于启动进程,耗时的进程将执行它在子线程中的执行.
希望这将解决您的问题..
c# – 正常处理Windows服务的关闭
在此Windows服务的生命周期中的某个时刻,您可能希望通过services.msc关闭它或重新启动它,但是如果您无法在服务的时间跨度内停止所有操作并终止Windows服务中的所有线程. msc期望用stop程序完成,它会挂起,你必须从任务管理器中删除它.
由于上面提到的问题,我的问题如下:如何实现处理Windows服务关闭的故障安全方法?我有一个挥发性布尔值作为关闭信号,由我的服务基类中的OnStop()启用,并且应该优雅地停止我的主循环,但如果在某个其他层中有一个操作,这是不值得的是时候做任何操作了.
应如何处理?我目前处于亏损状态,需要一些创造性的投入.
解决方法
这意味着您需要调整异步方法以考虑取消令牌.
您还应该知道ServiceBase.RequestAdditionalTime
.如果无法在适当的时候取消所有任务,您可以申请延长期.
或者,也许您可以探索IsBackground
替代方案.当进程即将退出时,CLR会停止Windows服务中启用了此功能的所有线程:
A thread is either a background thread or a foreground thread. Background threads are identical to foreground threads,except that background threads do not prevent a process from terminating. Once all foreground threads belonging to a process have terminated,the common language runtime ends the process. Any remaining background threads are stopped and do not complete.
今天关于处理Windows服务停止/暂停请求期间的延迟和windows暂停服务是什么意思的介绍到此结束,谢谢您的阅读,有关.net – 如何在服务停止的多线程Windows服务中停止工作线程、c# – System.Transactions中的未处理异常在网络不稳定期间停止Windows服务、c# – 停止Windows服务时出错、c# – 正常处理Windows服务的关闭等更多相关知识的信息可以在本站进行查询。
本文标签: