C# 服务丢失。。。某物

C# 服务丢失。。。某物,c#,service,winlogon,C#,Service,Winlogon,好的,我正在创建一个windows服务,它将根据用户是否登录来启动和停止渲染可执行文件。我已经确定要从服务运行exe,并且知道它将在没有gui的安全桌面上运行。这对我来说不是问题 问题是,当我告诉我的服务启动时,它会立即启动。我想这意味着我缺少了一些循环或事件处理程序之类的东西,但我不知道是什么。这是我尝试编程的第一个服务。因为似乎没有办法有效地调试服务,所以我希望从这里的聪明人那里得到一些意见 如果您有任何意见,我们将不胜感激!代码如下: using System; using System.

好的,我正在创建一个windows服务,它将根据用户是否登录来启动和停止渲染可执行文件。我已经确定要从服务运行exe,并且知道它将在没有gui的安全桌面上运行。这对我来说不是问题

问题是,当我告诉我的服务启动时,它会立即启动。我想这意味着我缺少了一些循环或事件处理程序之类的东西,但我不知道是什么。这是我尝试编程的第一个服务。因为似乎没有办法有效地调试服务,所以我希望从这里的聪明人那里得到一些意见

如果您有任何意见,我们将不胜感激!代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Management;

namespace SessionService
{
    public partial class renderServ : ServiceBase
    {
        private readonly ManagementClass _wmiComputerSystem = new ManagementClass("Win32_ComputerSystem");
        private Process process;
        Boolean isRunning;

        public renderServ()
        {
            InitializeComponent();

            process = new Process();
            process.StartInfo = new ProcessStartInfo(@"C:\Windows\notepad.exe");

            isRunning = false;
        }

        public void OnUserLogin()
        {
            /*if (isRunning == true)
            {
                process.Kill();
                process.WaitForExit();
            }*/
            isRunning = false;
        }

        public void OnUserLogoff()
        {
            if (isRunning == false)
            {
                process.Start();
                process.PriorityClass = ProcessPriorityClass.Idle;
            }
            isRunning = true;
        }

        protected override void OnSessionChange(SessionChangeDescription changeDescription)
        {
            base.OnSessionChange(changeDescription);

            switch (changeDescription.Reason)
            {
                case SessionChangeReason.SessionLogon:
                    {
                        OnUserLogin();
                    } break;
                case SessionChangeReason.SessionLogoff:
                    {
                        OnUserLogoff();
                    } break;
                case SessionChangeReason.SessionLock:
                    {
                        OnUserLogoff();
                    } break;
                case SessionChangeReason.SessionUnlock:
                    {
                        OnUserLogin();
                    } break;
            }
        }

        protected override void OnStart(string[] args)
        {
            CanHandleSessionChangeEvent = true;
            System.Windows.Forms.Application.Run();
        }

        protected override void OnStop()
        {
        }
    }
}

如果启动服务,则附加调试器(调试->附加到进程->选择服务)。你可以像对待任何其他应用程序一样逐步浏览代码。如果你不想要任何UI,你到底为什么要使用
System.Windows.Forms
的任何部分?在
OnStart
中,应该包含创建任何线程和/或计时器(或例如WCF主机)然后返回的代码。调用
OnStart
的线程不属于您,您需要从
OnStart
方法返回,然后才能启动服务。啊,如果我创建了一个循环计时器(我在另一个服务中看到了一些这样的例子),那么服务应该启动?是的,重要的是,
OnStart
需要返回<例如,code>Application.Run(),仅当其他调用
Application.Exit()
服务在会话0(服务运行的隔离会话)中运行时返回。没有人登录或注销,屏幕保护程序从不运行,没有人锁定工作站。所以这些事件永远不会发生。