windows 服务中的 运行 线程时出现错误 1607
Error 1607 when running thread in windows service
所以我试图在 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 程序直到服务器结束才结束。基本上当我右键单击服务并启动时,服务器启动,我也可以连接客户端,但状态不会更改为 "running"。当服务器代码停止执行时,它变为 运行。
这是上面的代码。
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();
}
}
上面的代码有效,但在右击并点击 'Start' 之后,状态变为 "Running" 是在服务器代码执行完毕后(当所有客户端离开并且服务器关闭时),而不是在此之前。
我是 windows 服务方面的新手,所以请原谅任何愚蠢的错误。
我认为您的问题的答案出现在这里:
Windows Service to run constantly
实际上 OnStart 需要 return 快速,您应该启动一个线程来处理您的逻辑。
一旦 OnStart 结束,状态将变为 "running",因此这与您的观察一致。
至于为什么您的进程在 运行 时在不同的线程上结束 -
我认为无论 OnStop 是什么,你的服务器都会关闭——这是停止服务的正确方法。根据您上面的解释,我怀疑它会在所有客户离开后关闭(Environment.Exit 或类似)。
您的 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
上关闭它。
所以我试图在 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 程序直到服务器结束才结束。基本上当我右键单击服务并启动时,服务器启动,我也可以连接客户端,但状态不会更改为 "running"。当服务器代码停止执行时,它变为 运行。 这是上面的代码。
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();
}
}
上面的代码有效,但在右击并点击 'Start' 之后,状态变为 "Running" 是在服务器代码执行完毕后(当所有客户端离开并且服务器关闭时),而不是在此之前。 我是 windows 服务方面的新手,所以请原谅任何愚蠢的错误。
我认为您的问题的答案出现在这里: Windows Service to run constantly
实际上 OnStart 需要 return 快速,您应该启动一个线程来处理您的逻辑。 一旦 OnStart 结束,状态将变为 "running",因此这与您的观察一致。
至于为什么您的进程在 运行 时在不同的线程上结束 - 我认为无论 OnStop 是什么,你的服务器都会关闭——这是停止服务的正确方法。根据您上面的解释,我怀疑它会在所有客户离开后关闭(Environment.Exit 或类似)。
您的 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
上关闭它。