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

C#服务应用程序启动无限线程,c#,multithreading,service,C#,Multithreading,Service,我设计了一个应用程序,它可以启动无限的线程。此线程通过SOAP-API从特定设备收集事件,并在触发特定事件时执行各种方法。 现在我希望所有这些都作为服务运行,但我不确定如何设计应用程序 我目前的计划是提供这项服务。该服务创建一个收集信息的“poller”类实例。然后,创建一个线程,该线程始终执行“poller”的轮询功能。“poller”实例和线程是否都应该在我的服务应用程序的OnStart事件中创建和执行?我是否必须在OnStop事件中停止线程?还是会有更聪明的设计 我不确定这一点,因为我读到

我设计了一个应用程序,它可以启动无限的
线程
。此
线程
通过SOAP-API从特定设备收集事件,并在触发特定事件时执行各种方法。
现在我希望所有这些都作为服务运行,但我不确定如何设计应用程序

我目前的计划是提供这项服务。该服务创建一个收集信息的“poller”类实例。然后,创建一个线程,该线程始终执行“poller”的轮询功能。“poller”实例和线程是否都应该在我的服务应用程序的
OnStart
事件中创建和执行?我是否必须在
OnStop
事件中停止线程?还是会有更聪明的设计

我不确定这一点,因为我读到,
OnStart
事件不应该永远执行。但是如果我从这里调用
线程
,它会永远执行吗


感谢您的帮助,因为这是我的第一个服务应用程序:-)

将从您创建的轮询线程中使用“poller”类,因此您有一些选择。我可能会在轮询器类ctor中创建轮询线程——似乎没有理由让线程具有比这更大的作用域。如果添加了更多设备,您所需要做的就是创建更多轮询器实例

在OnStart()中,创建一个poller实例(它本身创建poller线程)并返回,因此满足“OnStart事件不应永远执行”条件

正在停止OnStop()中的线程?首先,尝试停止线程的首选方法-根本不要尝试这样做。从服务管理器或任务管理器关闭时,您的服务是否正常运行并立即停止?如果是这样的话,请不要尝试在OnStop()或poller类dtor中显式停止轮询线程,这会使工作变得不必要,甚至可能适得其反。只需将OnStop()留空,看看它是否正常工作

如果您发现必须在操作系统终止服务进程之前终止线程,则可能必须采取不正当手段说服轮询器线程立即退出,或者您可能会逃脱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。它启动正常,睡眠(0)循环显然在工作,因为该服务出现在“进程”选项卡上,在我的i7上CPU使用率约为17%。当我在Task Manager服务上选择“停止服务”时,服务状态立即变为“停止”,但流程消失大约需要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”以使线程不运行也没有任何问题-开始正常,停止正常。

将从您创建的轮询线程使用“poller”类,因此您有一些选择。我可能会在轮询器类ctor中创建轮询线程——似乎没有理由让线程具有比这更大的作用域。如果添加了更多设备,您所需要做的就是创建更多轮询器实例

在OnStart()中,创建一个poller实例(它本身创建poller线程)并返回,因此满足“OnStart事件不应永远执行”条件

正在停止OnStop()中的线程?首先,尝试停止线程的首选方法-根本不要尝试这样做。从服务管理器或任务管理器关闭时,您的服务是否正常运行并立即停止?如果是这样的话,请不要尝试在OnStop()或poller类dtor中显式停止轮询线程,这会使工作变得不必要,甚至可能适得其反。只需将OnStop()留空,看看它是否正常工作

如果您发现必须在操作系统终止服务进程之前终止线程,则可能必须采取不正当手段说服轮询器线程立即退出,或者您可能会逃脱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。它启动正常,睡眠(0)循环显然在工作,因为该服务出现在“进程”选项卡上,在我的i7上CPU使用率约为17%。当我在Task Manager服务上选择“停止服务”时,服务状态立即变为“停止”,但流程消失大约需要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”以使线程不运行也没有任何问题-开始正常,停止正常。

您需要自己尝试,然后在遇到具体问题时返回。您需要自己尝试,然后在遇到具体问题时返回。哇,非常感谢!这对我帮助很大!我还有一个问题:在创建poller实例时,如何“返回”以使OnStart()不会永远执行?只是