Windows服务启动后立即停止

5
我创建了一个Windows服务,它创建一个窗体,在其中创建了一个工具栏图标来管理套接字。我能够通过Visual Studio创建的安装程序进行安装,但是当我转到“服务”并启动我的服务时,它会给我一个错误,指出它已经启动并立即停止。
以下是服务代码:
public Service()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);

        ServiceName = "WizardServer";
        CanPauseAndContinue = false;
        CanHandleSessionChangeEvent = true;
        CanStop = true;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        try
        {
            connectionHandler = new ConnectionHandler();  
            serviceThread = new System.Threading.Thread(new ThreadStart(serviceTarget));
            alive = true;
            serviceThread.Start();
        }
        catch {}
    }

    private void serviceTarget()
    {
        Application.Run(new Form1(connectionHandler));

        while (alive) 
        {
            Thread.Sleep(10000);
        }
    }

    protected override void OnStop()
    {
        base.OnStop();

        try
        {
            connectionHandler.stop();
        }
        catch {}

        serviceThread.Abort();

        alive = false;
        Stop();
    }

PS:我已经测试过这个表单,它可以正常工作。


3
事件日志透露了什么信息? - Paulie Waulie
5
通常情况下,Windows服务并没有用户界面,微软强烈建议不要添加。详情请参阅 http://msdn.microsoft.com/en-us/library/ms683502%28v=vs.85%29.aspx。 - hatchet - done with SOverflow
@PaulieWaulie 在发布模式下,我在哪里可以看到日志? - Ricardo Amendoeira
@RicardoAmendoeira 前往管理工具 -> 事件查看器,然后查看Windows日志 -> 应用程序,可能会有一些有用的信息。我必须说我同意hatchet的观点,为服务创建UI似乎有点奇怪,服务通常是用于执行没有UI的代码。 - Paulie Waulie
如果这是在客户端机器上运行,我会创建一个文件夹并将其存储在其中。您可以仅用于故障排除,并稍后删除它(如果您希望)。 - DJ Burb
显示剩余5条评论
2个回答

1
我曾经遇到这个问题,在谷歌上搜寻了很多小时,最终找到了解决方案。您可以将以下代码添加到您的代码中。在类构造函数中添加InitializeTimer()。您应该在OnStart()中设置oTimer.Enabled = trueoTimer.Start(),并在OnStop()中设置oTimer.Stop()
代码:
  void create()
    {
        string s = "";
    }
    void InitializeTimer()
    {
        oTimer = new System.Timers.Timer(interval);
        oTimer.AutoReset = true;
        oTimer.Enabled = true;
        oTimer.Elapsed += new System.Timers.ElapsedEventHandler(oTimer_Elapsed);
    }

    void oTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        CreateFileData();
    }

    void CreateFileData()
    {
        string path = @"C:\SimpleWcfService\SimpleWindowsService\bin\Release\Singh.txt";
        StreamWriter oStreamWriter = new StreamWriter(path, true);
        oStreamWriter.WriteLine(DateTime.Now.ToString());
        oStreamWriter.Close();
        oStreamWriter = null;
    }

0
我回答得非常晚,但希望这可以帮助其他遇到同样问题的人:
在 Windows 服务项目的属性中更改“输出类型”对我有用。
  1. 在“解决方案资源管理器”中找到您的项目,双击“属性”
  2. 在打开的窗口中,转到“应用程序”选项卡
  3. 将“输出类型”下的值更改为“控制台应用程序”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接