C#Windows服务无法运行

问题描述 投票:2回答:2

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

正如我在本文开头所说,当我在“调试模式”中运行它时,一切正常,并且值将输入到数据库中。但是如果我安装并运行它,则不会在数据库中输入值。

谁能解释我为什么或忘了什么?

c# windows service
2个回答
1
投票

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

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.