Служба Windows .NET резко останавливается - PullRequest
0 голосов
/ 11 ноября 2009

Привет, ребята, Я создал службу Windows, которая порождает три потока. Первый поток просыпается каждые 15 секунд, второй поток просыпается каждую минуту. и третий поток один раз в день. Мой код выглядит примерно так:

        var timer1 = new Timer();
        timer1.Elapsed += ProcessTimerEvent1;
        timer1.Interval = 60000;
        timer1.Start();

        var timer2 = new Timer();
        timer2.Elapsed += ProcessTimerEvent2;
        timer2.Interval = 15000;
        timer2.Start();

        var timer3 = new Timer();
        timer3.Elapsed += ProcessTimerEvent3;
        timer3.Interval = 86400000;
        timer3.Start();

Из моих журналов событий видно, что там написано .NET Runtime 2.0 Отчет об ошибках EVENTID: 5000.

Я посмотрел в сети, и он говорит недопустимое исключение операции.

Думаете ли вы, ребята, что остановка сервиса связана с потоками? И еще один глупый вопрос: я порождаю 3 новых потока каждый раз, или те же самые потоки встают каждые 15 секунд или 1 минуту.

Ответы [ 4 ]

2 голосов
/ 11 ноября 2009

Возможно, одна из ваших тем выдает необработанное исключение . Это позволит вашему процессу немедленно умереть. Убедитесь, что вы обрабатываете любое исключение внутри ваших потоков в какой-то момент, заключая код внутри потока в блоки try-catch (и не забывайте правильно регистрироваться, чтобы вы могли быть в курсе происходящих ошибок). 1003 *

0 голосов
/ 19 ноября 2009

Алиса

Вы можете добавить обработку необработанных исключений в свой сервис с помощью кода, подобного следующему: -

namespace YourNamespace
{
    static class Program
    {

        [STAThread]
        static void Main()
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            HandleException(e.Exception);
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            HandleException((Exception)e.ExceptionObject);
        }

        static void HandleException(Exception e)
        {
            //Handle/Log Exception Here
        }

    }
}

Спасибо

Phil

http://exceptioneer.com

0 голосов
/ 11 ноября 2009

Вы храните ссылку на таймеры для какого-либо глобального (статического) объекта? Если нет, даже если они все еще работают, они являются кандидатами на сборку мусора. CG вызовет своих деструкторов, которые по очереди вызовут метод Dispose, и ваши потоки будут резко остановлены

По второму вопросу; таймеры используют пул потоков для порождения потоков. Каждая обработка извлекает поток из пула, использует его и освобождает. Между периодами они просто ждут уведомлений от системных часов.

0 голосов
/ 11 ноября 2009

Вероятно, это связано с исключением из кода в одном из ваших событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...