Ошибка 1054 - Служба не ответила своевременно - Приложение C # - PullRequest
2 голосов
/ 20 октября 2011

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

 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. Я перенес это в свой метод и теперь отлично работает. Счастливые дни, спасибо за ответы, так как это помогло мне найти место, которое я не искал. х

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

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

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();
}
0 голосов
/ 20 октября 2011

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

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

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

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

    if (_SQLCon.testSQLConnection())

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

...