在Windows服务中运行线程时出现错误1607

时间:2017-12-23 04:27:51

标签: c# multithreading service process threadpool

所以我试图在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服务,所以请原谅任何愚蠢的错误。

2 个答案:

答案 0 :(得分:2)

您的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上将其关闭。

答案 1 :(得分:0)

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

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

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