C#Windows服务无法运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#Windows服务无法运行相关的知识,希望对你有一定的参考价值。
我写了我的第一个C#Windows服务:现在我有一个小问题。如果我像那样调试代码
public static void Main(string[] args)
{
if (Environment.UserInteractive)
{
m_thread = new Thread(execute);
m_thread.Start();
}
else
{
}
}
该守则运作良好。
但是,如果我安装并运行该服务,则没有任何反应。我使用OnStart方法启动服务(见下文)
protected override void OnStart(string[] args)
{
m_thread = new Thread(execute);
m_thread.IsBackground = true;
m_thread.Start();
base.OnStart(args);
}
execute方法将创建一些子任务,例如在DB中输入Value
public static void execute()
{
var cancellationSource = new CancellationTokenSource();
CancellationToken token = cancellationSource.Token;
Console.WriteLine("RUN");
var t1 = Task.Run(() => WriteData("test", "test", token));
}
正如我在本文开头所说,当我在“调试模式”中运行它时,一切正常,并且值将输入到数据库中。但是如果我安装并运行它,则不会在数据库中输入值。
谁能解释我为什么或忘了什么?
答案
我不知道你的项目发生了什么,但服务不是由魔术服务仙女开始的。你实际上必须这样做。在某个时间点,你的Main
方法看起来像这样:
ServiceBase[] ServicesToRun = new ServiceBase[] { new MyService(args) };
ServiceBase.Run(ServicesToRun);
那段代码丢了。把它放回去,最好是在空的else
区块。
另一答案
我在创建自己的服务时发现的是,作为服务或用户交互式运行时,主线程不会被阻止。如果主线程退出 - 则它终止应用程序。记住 - 它仍然是一个控制台应用程序 - 如果主线程(静态void main())退出 - 那么应用程序有效地达到其生命的终点。
我通过添加Console.ReadLine()轻松解决了这个问题。防止应用程序到达Start方法的末尾。
替代方案包括循环 - 然后使用Stop方法提供一种突破无限循环的方法。
以上是关于C#Windows服务无法运行的主要内容,如果未能解决你的问题,请参考以下文章
无法将 PostgreSQL 作为 Windows 服务运行
无法从Windows服务中托管的Asp.net核心网站启动多个Serilog接收器