启动然后停止本地计算机上的C#服务

时间:2020-03-27 14:34:13

标签: c# mysql windows-services

这是我的新员工。 我使用c#创建Windows服务以连接到mySQL数据库。当我运行该服务时,它给了我如图所示的错误,并且没有更改数据库中的任何内容。 这是我的代码:

namespace WindowsService1
{
    public partial class Watcher : ServiceBase
    {
        public Watcher()
        {
            InitializeComponent();
        }

    protected override void OnStart(string[] args)
    {
        Write();
    }

    protected override void OnStop()
    {
    }

    public void Write()
    {
        MySqlConnection connection = new MySqlConnection("Host=--;User=--;Password=--;Database=--;Convert Zero Datetime=True");

        connection.Open();
        var command = connection.CreateCommand();
        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = " UPDATE messured-values SET belong_to = 'Doaa'";
        command.ExecuteNonQuery();
        Console.WriteLine("done");

    }
}

和错误,如下图所示 谢谢您的帮助。

enter image description here

1 个答案:

答案 0 :(得分:1)

该错误是因为您未正确编码服务的使用。但这不是您的主要问题。这是一个误报,您仍然需要找到潜在的错误。

对于Windows服务,OnStart方法应仅用于启动进程,而不能实际运行将自行处理的任何代码。

服务在其生命周期中具有以下状态

  1. 运行
  2. 已暂停
  3. 已停止

OnStart方法应将服务从“已停止”或“已暂停”(如果支持)状态移动到“正在运行”状态,并应很快返回。

所以第一件事就是将代码移到单独的线程中。即使只执行一次。

protected override void OnStart(string[] args)
{
    var task = Task.Run(() =>{
            Write();
     });
}

然后更新您的Write方法以捕获异常,使用参数,然后记录错误

try
{
        using (MySqlConnection connection = new MySqlConnection("Host=--;User=--;Password=--;Database=--;Convert Zero Datetime=True"))
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = " UPDATE messured-values SET belong_to = @belong";
                command.Parameters.Add("@belong", SqlDbType.VarChar).Value = "Doaa";
                command.ExecuteNonQuery();
            }
            connection.Close();
        }
    }
    catch(Exception e)
    {
        //Log e.Message to a Log output file for debug purposes/
    }

您需要编写将错误输出到调试日志文件或类似文件的方法。

相关问题