C#Windows服务无法运行

时间:2018-03-02 09:17:05

标签: c# windows service

我写了我的第一个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));
}

正如我在本文开头所说,当我在"调试模式"一切正常,值输入数据库。但是,如果我安装&运行它,不会在数据库中输入值。

任何人都可以解释我为什么或忘记了什么?

2 个答案:

答案 0 :(得分:1)

我不知道你的项目发生了什么,但服务不是由神奇的服务仙女开始的。你实际上必须。在某个时间点,您的Main方法看起来像这样:

ServiceBase[] ServicesToRun = new ServiceBase[] { new MyService(args) };
ServiceBase.Run(ServicesToRun);

那段代码丢失了。把它放回去,最好是空的else区块。

答案 1 :(得分:0)

我在创建自己的服务时发现的是,作为服务或用户交互式运行时,主线程不会被阻止。 如果主线程退出 - 则它终止应用程序。 记住 - 它仍然是一个控制台应用程序 - 如果主线程(静态void main())退出 - 那么应用程序有效地达到了它的生命周期。

我通过添加Console.ReadLine()轻松解决了这个问题。防止应用程序到达Start方法的末尾。

替代方案包括循环 - 然后使用Stop方法提供一种突破无限循环的方法。