Ошибка 1054 — Служба не ответила своевременно — Приложение C #

#c# #service #saas

#c# #Обслуживание #saas

Вопрос:

У меня возникла проблема с установкой моего приложения-службы. Когда я запускаю режим отладки, все работает правильно, и все логические вещи работают. Я уже писал сервисные приложения раньше, и, сравнивая их, между этим и рабочим есть небольшая разница. Заранее спасибо за любую помощь в моем коде:

  class MainClass : ServiceBase
{
    ABCSQLCon _SQLCon = new ABCSQLCon();
    private int cycleTime = 0;

    private delegate void processError(String errorMessage);

    static void Main(string[] args)
    {
        #if(!DEBUG)
            ServiceBase.Run(new MainClass());
        #else
            MainClass service = new MainClass();
            service.OnStart(new string[0]);
        #endif
    }

    protected override void OnStart(string[] args)
    {
        addToLog("Testing SQL Connection...", "Log");
        cycleTime = _SQLCon.sleepTime;
        addToLog("Sleep Time has been set...", "Log");
        if (_SQLCon.testSQLConnection())
        {
            addToLog("Connection to SQL Database succeeded", "Log");
           // queryThread();

            //not neccessary to make applicated multithreaded yet.
            addToLog("Starting Query Thread...", "Log");
            ThreadStart queryCycle = new ThreadStart(queryThread);
            Thread qThread = new Thread(queryCycle);
            qThread.Start();
        }
    }

    private void startProgram()
    {
    }

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

    public MainClass()
    {
        this.ServiceName = "ABCSQL Engine";
    }
  

Ах, я нашел проблему сейчас, тест подключения sql был просто быстрым открытием и закрытием, но я не видел или не понимал, где я инициализировал этот объект _SQLCON.
Я перенес это в свой метод и теперь работает нормально. Счастливые дни, спасибо за ответы, поскольку это помогло мне найти то место, которое я не искал. x

Комментарии:

1. Пожалуйста, уточните, в чем проблема — в вашем вопросе неясно.

2. Вероятно, выполнение функции testSQLConnection() занимает слишком много времени. Диспетчер управления службами дает вам только короткое время для завершения OnStart метода, прежде чем он определит, что он завис.

Ответ №1:

Рекомендуется вызывать методы в другом потоке, а затем в служебном потоке, чтобы избежать блокировки служебного потока

 public void MyMethod()
{
        addToLog("Testing SQL Connection...", "Log");
        cycleTime = _SQLCon.sleepTime;
        addToLog("Sleep Time has been set...", "Log");
        if (_SQLCon.testSQLConnection())
        {
            addToLog("Connection to SQL Database succeeded", "Log");
           // queryThread();

            //not neccessary to make applicated multithreaded yet.
            addToLog("Starting Query Thread...", "Log");
            ThreadStart queryCycle = new ThreadStart(queryThread);
            Thread qThread = new Thread(queryCycle);
            qThread.Start();
        }

}

 private Thread _myThread;
 protected override void OnStart(string[] args)
{
        ThreadStart threadStart = MyMethod;
         _myThread = new Thread(threadStart);
         _myThread.Start();
}
  

Комментарии:

1. Ах, я нашел проблему сейчас, тест подключения sql был просто быстрым открытием и закрытием, но я не видел или не понимал, где я инициализировал этот объект _SQLCON. Я перенес инициализацию _SQLCON в свой метод и теперь работает нормально. Счастливые дни, спасибо за ответы, поскольку это помогло мне найти то место, которое я не искал. x

Ответ №2:

Проблема в том, что вы устанавливаете соединение с базой данных при инициализации самой службы.

Это работает в режиме отладки, потому что вы фактически не запускаете его как службу:

     #if(!DEBUG)
        ServiceBase.Run(new MainClass());
    #else
        MainClass service = new MainClass();
        service.OnStart(new string[0]);
    #endif
  

Я подозреваю, что метод запуска занимает много времени из-за этой строки:

     if (_SQLCon.testSQLConnection())
  

Вам необходимо убедиться, что метод запуска службы возвращается своевременно, и любой потенциально длительный процесс выполняется в потоке. Если вы переместите этот тест в поток, вы должны обнаружить, что он работает нормально.