C#Windows服务未正确运行

C#Windows服务未正确运行,c#,windows-services,filesystemwatcher,C#,Windows Services,Filesystemwatcher,我已经编写了一个Windows服务(使用Visual Studio 2010 Premium、C#、.NET 4)来监视文件夹。它所做的只是检测文件夹中的更改(添加的文件/文件夹、删除的内容等),并将检测结果写入文本文件。不是事件日志,只是一个普通的.txt文件 现在,它安装得很好(我想),它显示在计算机管理中,允许我运行它。它应该将“监视已启动”写入文件,但它没有。然后,当我尝试停止服务时,它会给我以下错误: Windows无法停止本地计算机上的FileMonitoring服务。该服务未返回错

我已经编写了一个Windows服务(使用Visual Studio 2010 Premium、C#、.NET 4)来监视文件夹。它所做的只是检测文件夹中的更改(添加的文件/文件夹、删除的内容等),并将检测结果写入文本文件。不是事件日志,只是一个普通的.txt文件

现在,它安装得很好(我想),它显示在计算机管理中,允许我运行它。它应该将“监视已启动”写入文件,但它没有。然后,当我尝试停止服务时,它会给我以下错误:

Windows无法停止本地计算机上的FileMonitoring服务。该服务未返回错误。这可能是Windows内部错误或内部服务错误。如果问题仍然存在,请与系统管理员联系

而且不会停止。然后,当我再次尝试停止时,会出现以下错误:

“Windows无法停止本地计算机上的FileMonitoring服务。错误1061:该服务此时无法接受控制消息。”

然后它停止了

有人知道如何解决这个问题吗?在这项服务之前,我只做了一个简单的服务,当服务启动时,我将其写入一个.txt文件“Started”,当服务停止时,我将其写入一个.txt文件“Stopped”,它工作得非常好。所有添加到其中的内容都是使用
FileSystemWatcher

任何帮助都将不胜感激,我会提供您需要的任何信息/代码片段,尽管问

提前谢谢

编辑:

以下是一些代码:

protected override void OnStart(string[] args)
{
    watcher = new FileSystemWatcher();
    watcher.Path = @"C:\temp\services\Watched";

    watcher.Changed += new FileSystemEventHandler(LogFileSystemChanges);
    watcher.Created += new FileSystemEventHandler(LogFileSystemChanges);
    watcher.Deleted += new FileSystemEventHandler(LogFileSystemChanges);
    watcher.Renamed += new RenamedEventHandler(LogFileSystemRenaming);
    watcher.Error += new ErrorEventHandler(LogBufferError);
    watcher.EnableRaisingEvents = true;

    LogEntry("Monitoring Started.");
}

protected override void OnStop()
{
    watcher.EnableRaisingEvents = false;
    watcher.Dispose();

    LogEntry("Monitoring Stopped.");
}

void LogEntry(string message)
{
    counter++;

    FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
    StreamWriter sw = new StreamWriter(fs);

    sw.WriteLine(counter + ". " + message);

    fs.Close();
    sw.Close();
}
编辑2:

好吧,有人注意到我没有关闭我的流。傻,傻我。现在,我在那之后运行了服务,没有得到相同的错误,我得到了这个:

“本地计算机上的FileMonitoring服务启动后停止。某些服务在其他服务或程序未使用时自动停止。”

这看起来简单多了,但我还是不知所措。有什么想法吗


非常感谢

可能日志文件仍被以前的进程阻止。尝试删除它。如果可能的话,情况并非如此

如果无法删除该文件,请尝试重新启动并再次尝试删除。现在应该可以工作了


将来,文件将不再被阻止,因为您关闭了流。但是,您应该最终实现一个尝试catch,以便文件错误在错误之后被明确关闭。

< p>您必须考虑的一件事(尽管我不认为这是您的问题)是对文件的并发访问。

为了确保流是关闭的,最好也使用语句将它们包装起来

protected override void OnStart(string[] args)
{
    watcher = new FileSystemWatcher();
    watcher.Path = @"C:\temp\services\Watched";

    watcher.Changed += new FileSystemEventHandler(LogFileSystemChanges);
    watcher.Created += new FileSystemEventHandler(LogFileSystemChanges);
    watcher.Deleted += new FileSystemEventHandler(LogFileSystemChanges);
    watcher.Renamed += new RenamedEventHandler(LogFileSystemRenaming);
    watcher.Error += new ErrorEventHandler(LogBufferError);
    watcher.EnableRaisingEvents = true;

    LogEntry("Monitoring Started.");
}

protected override void OnStop()
{
    watcher.EnableRaisingEvents = false;
    watcher.Dispose();

    LogEntry("Monitoring Stopped.");
}

private object lockObject = new Object();

void LogEntry(string message)
{
    lock (lockObject)
    {
        counter++;

        using (StreamWriter sw = File.AppendText(path))
        {
            sw.WriteLine(counter + ". " + message);
        }
    }
}
您可以使用的另一个技巧是System.Diagnostics.Debugger.Break();方法。如果您在服务的开头添加了此选项,它会提示您将VisualStudio附加到它,您可以逐步完成此操作

希望有帮助。

这行:

sw.Close(); 
可能正在抛出ObjectDisposedException,因为您已经关闭了它的底层文件流,而它仍有数据要刷新

未捕获异常将使进程崩溃,您看到的错误是Windows SCM报告它注意到了这一点


编辑:另外,我认为您可能需要在写入条目之前查找文件的结尾。这可能就是您没有看到开始事件消息的原因。

您能提供一些代码吗?例如,您是如何启动FileSystemWatcher的?我在那里添加了一些代码-希望能有所帮助。也向我们展示顶部的
代码。关闭文件流怎么样。资源仍然是开放的!哦,不。。如果这行得通,我会非常尴尬的!你说的日志文件是指我写的文本文件吗?如果是这样,是的,我试着删除它,然后重新安装服务,但它只是返回相同的错误。也许你需要一些东西,如计时器,以保持服务的活力。我不知道FileSystemWatcher是否初始化了一个持续运行的后台进程。哦,我对计时器没有太多经验!这是从系统开始的时间。线程类不是吗?看看这篇文章:我不确定是什么修复了它,因为我使用了你的使用代码,并将我的服务启动从手动更改为自动,所以。。。虽然它的启动和停止都很好,但它只是将停止的数据写入文本文件。我得调查一下。非常感谢你!我完全知道那是什么!您没有附加到文件,而是每次都覆盖它!我正在更新代码以更改此设置。