我写了我的第一个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中输入值
public static void execute()
{
var cancellationSource = new CancellationTokenSource();
CancellationToken token = cancellationSource.Token;
Console.WriteLine("RUN");
var t1 = Task.Run(() => WriteData("test", "test", token));
}
正如我在本文开头所说,当我在"调试模式"一切正常,值输入数据库。但是,如果我安装&运行它,不会在数据库中输入值。
任何人都可以解释我为什么或忘记了什么?
答案 0 :(得分:1)
我不知道你的项目发生了什么,但服务不是由神奇的服务仙女开始的。你实际上必须做。在某个时间点,您的Main
方法看起来像这样:
ServiceBase[] ServicesToRun = new ServiceBase[] { new MyService(args) };
ServiceBase.Run(ServicesToRun);
那段代码丢失了。把它放回去,最好是空的else
区块。
答案 1 :(得分:0)
我在创建自己的服务时发现的是,作为服务或用户交互式运行时,主线程不会被阻止。 如果主线程退出 - 则它终止应用程序。 记住 - 它仍然是一个控制台应用程序 - 如果主线程(静态void main())退出 - 那么应用程序有效地达到了它的生命周期。
我通过添加Console.ReadLine()轻松解决了这个问题。防止应用程序到达Start方法的末尾。
替代方案包括循环 - 然后使用Stop方法提供一种突破无限循环的方法。