c# служба на локальном компьютере запускается, а затем останавливается - PullRequest
1 голос
/ 27 марта 2020

Я новичок в этом штате. Я создаю сервис windows, используя c# для подключения к базе данных 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 Ответ

1 голос
/ 27 марта 2020

Ошибка в том, что вы неправильно кодируете использование сервиса. Но это не ваша главная проблема в этом случае. Это ложное срабатывание, и вам все равно нужно найти основную ошибку.

Для 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/
    }

Вам необходимо написать методы для вывода ошибка в файле журнала отладки или подобное.

...