1

当我尝试启动我的 c# 服务时,它说:“正在启动”一秒钟,然后又回到“停止”状态,这可能是什么问题?我之前有相同的代码,它可以工作,但现在对代码进行了一些更改,它停止了工作。这是我添加到代码中的内容:

应用配置:

<add key="cut-copy" value="copy"/>

正常代码:

    private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
    String cut_copy = ConfigurationManager.AppSettings[@"cut-copy"];

if (cut_copy == "copy")
    {
        cut = false;
    }
    else
    {
        cut = true;
    }
if (WaitForFileAvailable(e.FullPath, TimeSpan.FromSeconds(10)))
            {
            var file = Path.Combine(source, e.Name);
            var copy_file = Path.Combine(target, e.Name);
            var destination = Path.Combine(target, Path.ChangeExtension(source, Path.GetExtension(source)));

                    if (File.Exists(file))// Check to see if the file exists. 
                    {                     //If it does delete the file in the target and copy the one from the source to the target.
                        File.Delete(copy_file);
                        File.Copy(e.FullPath, Path.Combine(target, e.Name));
                    }
                    else// If it doesn't, just copy the file.
                    {
                        if (cut == true)
                        {
                            if (File.Exists(file))// Check to see if the file exists. 
                            {                     //If it does delete the file in the target and copy the one from the source to the target.
                                File.Delete(copy_file);
                                File.Move(Path.Combine(e.FullPath, e.Name), target);
                            }
                        }
                        else
                        {
                            if (File.Exists(file))// Check to see if the file exists. 
                            {                     //If it does delete the file in the target and copy the one from the source to the target.
                                File.Delete(copy_file);
                                File.Copy(e.FullPath, Path.Combine(target, e.Name));
                            }
                        }
    //under this is more code that didn't change
    }

编辑:开始:

protected override void OnStart(string[] args)
    {
      base.OnStart(args);
      this.fileSystemWatcher1 = new System.IO.FileSystemWatcher();
      ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit();
      fileSystemWatcher1.Path = source;
      fileSystemWatcher1.Changed += new FileSystemEventHandler(fileSystemWatcher1_Changed);
      fileSystemWatcher1.Created += new FileSystemEventHandler(fileSystemWatcher1_Created);
      fileSystemWatcher1.Deleted += new FileSystemEventHandler(fileSystemWatcher1_Deleted);
      fileSystemWatcher1.Renamed += new RenamedEventHandler(fileSystemWatcher1_Renamed);

      this.fileSystemWatcher1.EnableRaisingEvents = true;
      this.fileSystemWatcher1.IncludeSubdirectories = true;
      ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit();
      logger("Service started "+ DateTime.Now);
    }

我究竟做错了什么?

4

2 回答 2

1

通常这种行为表明OnStart方法结束时没有留下任何线程在运行。我经历过,如果启动服务时抛出未处理的异常,服务不会进入停止状态,但服务管理器显示“正在启动服务”窗口 30 秒然后失败说它无法确定服务的状态.

我不确定是否FileSystemWatcher真的产生了一个继续运行的新线程。您可以(只是尝试一下),还可以创建一个System.Timers.Timer每 30 秒触发一次OnStart并在OnStop. 如果服务继续运行,则必须为FileSystemWatcher.

通常,OnStart您会生成一个单独的线程来完成服务的工作。无论是等待 TCP 连接、定期执行任务的计时器还是任何其他类型的线程。如果您不这样做,则服务将在没有更多线程处于活动状态时立即停止。

于 2013-09-10T10:18:06.970 回答
0

对于代码,任何人都可以给您的唯一答案只是“猜测”。你最好自己调试一下。

在 Windows 服务中打断点的最简单方法是将这行代码放在 OnStart 方法的开头:

Debugger.Break();
  • 在调试模式下编译你的服务,这样你就可以在你的可执行文件中拥有所有必要的符号。
  • 安装你的服务
  • 从服务列表启动它。
  • 您将收到调试“yourservicename.exe”程序的提示。
  • 说是-调试,选择调试器。
  • 选择正确的 Visual Studio 版本作为调试器。
  • 现在您将进入 Debugger.Break 行
  • 玩得开心
于 2013-09-10T10:24:06.393 回答