![](/img/trans.png)
[英]How will i achieve the endless loop without timer/thread in C# windows service?
[英]C# Service Application to start endless Thread
我设计了一个启动无限Thread
的应用程序。 当触发特定事件时,此Thread
通过SOAP-API从特定设备收集事件,并执行各种方法。
现在,我希望所有这些都可以作为服务运行,但是我不确定如何设计应用程序。
我目前的计划是提供服务。 该服务创建一个“ poller”类的实例,该实例收集信息。 之后,将创建一个线程,该线程始终执行“轮询器”的轮询功能。 是否应该在我的服务应用程序的OnStart
事件中创建并执行“ poller”的实例和线程? 我是否必须在OnStop
事件中停止线程? 还是会有更巧妙的设计?
我不确定,因为我读到OnStart
事件不应该永远执行。 但是,如果我从这里调用Thread
,它将永远执行吗?
感谢您的帮助,因为这是我的第一个服务应用程序:-)
“ poller”类将在您创建的轮询线程中使用,因此您有一些选择。 我可能会在poller类ctor中创建轮询线程-似乎没有理由使该线程具有更大的作用域。 如果添加了更多设备,那么您要做的就是创建更多轮询器实例。
在OnStart()中,创建一个轮询器实例(它本身会创建轮询器线程),然后返回,因此满足“不应永远执行OnStart-Event”的条件。
在OnStop()中停止线程? 首先,尝试停止线程的首选方法-完全不要尝试这样做。 从服务管理器或任务管理器中关闭后,您的服务是否运行正常并立即停止? 如果是这样,则不要通过尝试在OnStop()或poller类dtor中显式停止轮询线程来进行不必要的工作,并且可能会适得其反。 只需将OnStop()保留为空,看看它是否可以正常工作。
如果您发现必须在OS终止服务进程之前终止线程,则可能必须采取de回的手段来说服轮询程序线程迅速退出,或者您可能会放弃Thread.Interrupt()。 要看..
只是看,我尝试了这个:
class poller
{
public static void ThreadProc()
{
for (;;)
{
Thread.Sleep(0);
}
}
Thread myThread;
public poller(){
myThread = new Thread(new ThreadStart(ThreadProc));
myThread.Priority = ThreadPriority.BelowNormal;
myThread.Start();
}
};
class WindowsService : ServiceBase
{
poller thisPoller;
public WindowsService()
{
this.ServiceName = "My Windows Service";
this.EventLog.Log = "Application";
this.CanHandlePowerEvent = true;
this.CanHandleSessionChangeEvent = true;
this.CanPauseAndContinue = true;
this.CanShutdown = true;
this.CanStop = true;
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
thisPoller = new poller();
}
protected override void OnStop()
{
base.OnStop();
}
在了解了一些项目属性并运行了正确的installUtil版本之后,它构建并安装了OK。 它开始正常,sleep(0)循环显然可以正常工作,因为该服务出现在“进程”选项卡上,而我的i7上的CPU使用率为〜17%。 当我在任务管理器服务上选择“停止服务”时,服务状态立即变为“已停止”,但是该过程消失大约需要20秒钟,(?)。
为了获得更多的乐趣,我真的装满了盒子。 我停止了该服务,将其卸载并重建:
protected override void OnStart(string[] args)
{
base.OnStart(args);
thisPoller = new poller();
thisPoller = new poller();
thisPoller = new poller();
thisPoller = new poller();
thisPoller = new poller();
thisPoller = new poller();
thisPoller = new poller();
thisPoller = new poller();
}
重新安装并重新启动后,我知道它正在工作,因为在进入任务管理器之前,我可以听到CPU风扇的转速。 当然,在所有8个内核上均为100%。
即使有8个CPU循环线程,停止也没问题。 同样,状态立即变为“已停止”,并且该过程在20秒后消失了。
将“睡眠”间隔设置为“ 1000000”,以使线程不运行也没有任何问题-启动OK,停止OK。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.