C# 服务停止而不停止()

C# 服务停止而不停止(),c#,service,C#,Service,我有一个在OnStart中创建FileSystemWatcher的服务,我希望该服务仅在创建文件后结束 所以我有这个密码 protected void OnStart() { try { using (FileSystemWatcher watcher = new FileSystemWatcher()) { watcher.P

我有一个在OnStart中创建FileSystemWatcher的服务,我希望该服务仅在创建文件后结束

所以我有这个密码

protected void OnStart()
        {

            try
            {
                using (FileSystemWatcher watcher = new FileSystemWatcher())
                {
                    watcher.Path = WatchPath;
                    watcher.NotifyFilter = NotifyFilters.LastWrite;
                    watcher.Filter = "*.txt";
                    watcher.IncludeSubdirectories = false;
                    watcher.Changed += OnCreated;
                    watcher.EnableRaisingEvents = true;
                    logEvents.Write(MyLogClass.LogLevel.Info, "Watcher created");
                }
            }
            catch (Exception ex)
            {
                logEvents.Write(MyLogClass.LogLevel.Info, ex.Message);
            }

            if (finished)
            {
                OnStop();
            }
        }
bool finished仅在OnCreated的最后一行中设置为true

private void OnCreated(object sender, FileSystemEventArgs e)
        {
            //Here I do all the stuff I need and then:
            finished = true;
        }
但即使未执行OnCreated,服务也会结束,我会得到:

程序-已退出,代码为0 0x0


我试着在代码的不同部分调用OnStop,但同样的事情无论如何都会发生。我希望服务在创建给定文件之前保持静止,并在完成oncreate后重新启动,但我不知道这有什么问题。

您的代码执行一次,然后结束

您需要在主代码周围设置一个带有睡眠计时器的循环,以使其保持活动状态。并在这里嵌入您的支票完成

编辑: 如评论中所述。
我错过了你在OnStart做这件事。不应在此处执行循环,否则windows会认为您的服务无法启动。因此,您还需要重构它。

您的代码执行一次,然后结束

您需要在主代码周围设置一个带有睡眠计时器的循环,以使其保持活动状态。并在这里嵌入您的支票完成

编辑: 如评论中所述。 我错过了你在OnStart做这件事。不应在此处执行循环,否则windows会认为您的服务无法启动。因此,您还需要对其进行重构。

一个FileSystemWatcher本身不足以保持进程运行。当没有事件被服务时,就不需要线程,即使需要一个线程,它也将是一个后台线程

流程需要保持运行的是。该线程正在做什么并不重要,只要至少存在一个线程

对于这样一个线程,您似乎没有任何有用的工作要做——但您需要一个。我建议您创建一个线程,只需等待设置。然后使用该变量而不是finished变量来指示何时关闭服务

此时,前景线程退出,没有前景线程留下,进程关闭,服务停止

请注意,您必须为此等待的工作创建一个新线程。调用OnStart和OnStop的线程不属于您。它是一个为服务控制管理器提供服务的线程,您需要让它这样做。

一个FileSystemWatcher本身不足以保持进程运行。当没有事件被服务时,就不需要线程,即使需要一个线程,它也将是一个后台线程

流程需要保持运行的是。该线程正在做什么并不重要,只要至少存在一个线程

对于这样一个线程,您似乎没有任何有用的工作要做——但您需要一个。我建议您创建一个线程,只需等待设置。然后使用该变量而不是finished变量来指示何时关闭服务

此时,前景线程退出,没有前景线程留下,进程关闭,服务停止


请注意,您必须为此等待的工作创建一个新线程。调用OnStart和OnStop的线程不属于您。这是一个为服务控制管理器提供服务的线程,您需要让它这样做。

顺便说一句,您不应该从OnStart或任何地方调用OnStop explicity。否则,当您的服务处于另一个状态时,服务控制经理将报告一个状态。我认为这很可能是错误的,但由于它无论如何都会停止,所以我尝试了失败。这是我第一次创建服务,没关系。下面有一些很好的提示和链接。祝你好运顺便说一下,你不应该从OnStart或任何地方调用OnStop explicity。否则,当您的服务处于另一个状态时,服务控制经理将报告一个状态。我认为这很可能是错误的,但由于它无论如何都会停止,所以我尝试了失败。这是我第一次创建服务,没关系。下面有一些很好的提示和链接。祝你好运我对这一切都很陌生,请原谅我的无知。你说可能产生一个线程/运行任务是什么意思?我对这一切都很陌生,请原谅我的无知。你所说的可能产生线程/运行任务是什么意思?创造了奇迹。我不知道这件事,但我觉得它会经常派上用场。谢谢!创造了奇迹。我不知道这件事,但我觉得它会经常派上用场。谢谢!