【问题标题】:Error 1607 when running thread in windows service在 Windows 服务中运行线程时出现错误 1607
【发布时间】:2017-12-23 04:27:51
【问题描述】:

所以我试图在 Windows 服务中创建一个线程,但在尝试执行它时出现错误 1607。 这是我的代码

  protected override void OnStart(string[] args)
    {

        string path = AppDomain.CurrentDomain.BaseDirectory + "Log.txt";
        using (sw = File.AppendText(path))
        {
            sw.WriteLine("the service has started");

           server = new Server(sw);
           server.start();
           start = true;

            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = false;
                /* run your code here */
                while (start != true)
                {
                    Thread.Sleep(2000);
                }
                // tcp ip server
                server.started();

            }).Start();

        }
    }

当我在没有线程的情况下运行它时,OnStart 程序在服务器结束之前不会结束。基本上,当我右键单击服务并启动时,服务器启动,我也可以连接客户端,但状态不会变为“正在运行”。当服务器代码停止执行时,它变为运行。 这是上面的代码。

 protected override void OnStart(string[] args)
    {

        string path = AppDomain.CurrentDomain.BaseDirectory + "Log.txt";
        using (sw = File.AppendText(path))
        {
            sw.WriteLine("the service has started");

           server = new Server(sw);
           server.start();
           start = true;

           // running without thread
            server.started();
        }
     }

上面的代码可以工作,但是在右键单击并点击“开始”后,在服务器代码执行完成后(当所有客户端离开并且服务器关闭时)状态更改为“正在运行”,而不是在此之前。 我对 Windows 服务的东西真的很陌生,所以请原谅任何愚蠢的错误。

【问题讨论】:

  • 在您的第二个示例中,服务不会更改为“正在运行”,因为您没有从 OnStart 返回。 docs.microsoft.com/en-us/dotnet/framework/windows-services/… 的教程清楚地表明 OnStart 应该设置一些东西(例如线程或计时器),以便服务可以异步监视,然后返回。至于错误1607,你从哪里得到的?安装时?启动时?您是否搜索过 1607 错误是什么?

标签: c# multithreading service process threadpool


【解决方案1】:

您的 OnStart 方法中有此代码:

    using (sw = File.AppendText(path))
    {
        sw.WriteLine("the service has started");

       server = new Server(sw);
       server.start();
       start = true;

        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = false;
            /* run your code here */
            while (start != true)
            {
                Thread.Sleep(2000);
            }
            // tcp ip server
            server.started();

        }).Start();
    }

您构造了一个Server 对象,将一个对您创建的文件的引用传递给它(即sw)。但随后您启动线程并退出 using 块,该块将处理文件。

稍后,server 对象尝试写入文件,但已被释放。所以服务器在线程中抛出了一个异常,它冒泡到主程序中,并把它变成了火山口。

您需要维护对该文件的引用,并在OnStop 上关闭它。

【讨论】:

  • 嗨,吉姆,非常感谢您的帮助。你是对的,我试图访问已经被处理的东西。我删除了 using 语句并且它起作用了。没有更多错误:)
  • @Shey:如果这篇文章解决了您的问题,请点击复选标记使其成为接受的答案。
【解决方案2】:

我认为您的问题的答案出现在这里: Windows Service to run constantly

实际上 OnStart 需要快速返回,您应该启动一个线程来处理您的逻辑。 一旦 OnStart 结束,状态将变为“正在运行”,因此这与您的观察一致。

至于为什么你的进程在不同的线程上运行时结束 - 我认为无论 OnStop 是什么,您的服务器都会关闭 - 这是停止服务的正确方法。根据您上面的解释,我怀疑它会在所有客户离开后关闭(Environment.Exit 或类似)。

【讨论】:

  • 嗨,萨沙,感谢您的帮助。问题已解决。 'using' 语句基本上用于在块外处理一些东西。我试图访问我的线程中已经处理的东西。所以,我为解决这个问题所做的就是删除“使用”块。它奏效了。非常感谢您的帮助和他人的帮助。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2013-03-15
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多