C# 在windows服务中运行线程时出现错误1607
因此,我试图在windows服务中创建一个线程,但在尝试执行它时遇到了一个错误1607。 这是我的密码C# 在windows服务中运行线程时出现错误1607,c#,multithreading,service,process,threadpool,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.W
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需要快速返回,您应该启动一个线程来处理您的逻辑。 一旦OnStart结束,状态将变为“running”,因此这与您的观察结果一致 至于进程在不同线程上运行时结束的原因-
我认为不管是在桌面上,服务器都会关闭,这是停止服务的正确方式。根据您上面的解释,我怀疑一旦所有客户端离开,它就会关闭(Environment.Exit或类似功能)。我认为您的问题的答案如下所示: 实际上,OnStart需要快速返回,您应该启动一个线程来处理您的逻辑。 一旦OnStart结束,状态将变为“running”,因此这与您的观察结果一致 至于进程在不同线程上运行时结束的原因-
我认为不管是在桌面上,服务器都会关闭,这是停止服务的正确方式。根据您上面的解释,我怀疑一旦所有客户端离开,它就会关闭(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();
}
您构造一个服务器
对象,向其传递对您创建的文件的引用(即sw
)。但是,然后启动线程并使用块退出,这将处理文件
在稍后的某个时刻,服务器
对象试图写入该文件,但它已被释放。因此服务器在线程中抛出一个异常,该异常向主程序冒泡,并使其崩溃
您需要维护对该文件的引用,并在OnStop
上关闭它。您的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();
}
您构造一个服务器
对象,向其传递对您创建的文件的引用(即sw
)。但是,然后启动线程并使用
块退出,这将处理文件
在稍后的某个时刻,服务器
对象试图写入该文件,但它已被释放。因此服务器在线程中抛出一个异常,该异常向主程序冒泡,并使其崩溃
您需要维护对该文件的引用,并在OnStop
上关闭它。在第二个示例中,服务不会更改为“Running”,因为您不是从OnStart
返回的。上的教程明确指出,OnStart
应该设置一些东西(例如线程或计时器),以便服务可以异步监视,然后返回。至于1607错误,你从哪里得到的?关于安装?启动时?您是否已搜索以发现错误1607?在第二个示例中,服务不会更改为“正在运行”,因为您没有从OnStart
返回。上的教程明确指出,OnStart
应该设置一些东西(例如线程或计时器),以便服务可以异步监视,然后返回。至于1607错误,你从哪里得到的?关于安装?启动时?你搜索过1607错误是什么吗?嗨,吉姆,非常感谢你的帮助。你是对的,我正试图访问一些已经处理的东西。我删除了using语句,它成功了。没有更多错误:)@Shey:如果这篇文章解决了你的问题,请点击复选标记,使其成为可接受的答案。嗨,吉姆,非常感谢你的帮助。你是对的,我正试图访问一些已经处理的东西。我删除了using语句,它成功了。没有更多错误:)@Shey:如果这篇文章解决了你的问题,请点击复选标记,使其成为可接受的答案。嘿,萨沙,谢谢你的帮助。问题解决了。“using”语句基本上用于处理块外的内容。我试图访问线程中已被处理的内容。所以,我所做的只是删除“使用”块来解决这个问题。它成功了。非常感谢你的帮助和其他人的帮助。谢谢:)嘿,萨沙,谢谢你的帮助。问题解决了。“using”语句基本上用于处理块外的内容。我试图访问线程中已被处理的内容。所以,我所做的只是删除“使用”块来解决这个问题。它成功了。非常感谢你的帮助和其他人的帮助。谢谢:)