繁体   English   中英

C#服务应用程序启动无尽线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM