Как узнать кто убивает мои темы - PullRequest
28 голосов
/ 20 апреля 2010

У меня есть ветка, которая просто изгоняет .. Я хотел бы знать, кто убивает мою ветку и почему.

Мне приходит в голову, что моя нить прерывается ОС, но я хотел бы подтвердить это и, если возможно, узнать, почему это убивает ее.

Что касается потока, я могу утверждать, что до его смерти требуется не менее 40 минут, но внезапно он умирает примерно через 5 минут.

public void RunWorker()
{
    Thread worker = new Thread(delegate()
    {
        try
        {
            DoSomethingForALongLongTime();
        }
        catch(Exception e)
        {
           //Nothing is never logged :(
           LogException(e);
           throw e;
        }
    });

    worker.IsBackground = true;
    worker.SetApartmentState(System.Threading.ApartmentState.STA);
    worker.Start();
}

РЕДАКТИРОВАТЬ: Адресация ответов

  • Try / Catch Возможные исключения:
    Он реализован и ничего не ловит: (
  • Основная нить умирает:
    Этот поток создан веб-сервером, который продолжает работать
  • Завершение работы:
    Работа не завершена, так как она, наконец, влияет на базу данных, я могу проверить, выполнено ли это, когда поток умирает.

Размышления об этих вещах привели меня к этому вопросу: кто убивает мои темы?

пс. Это не леди Голдент в гостиной с подсвечником :) 1023 *

Ответы [ 15 ]

2 голосов
/ 20 апреля 2010

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

1 голос
/ 12 мая 2010

Попробуйте использовать домен приложения Событие UnhandledException: http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

может дать вам некоторую информацию, если вы пропустите некоторые исключения

1 голос
/ 12 мая 2010

используйте AsyncTasks для достижения вашей продолжительной работы в asp.net

1 голос
/ 07 мая 2010

Вам следует использовать DoSomethingForALongLongTime () с большим количеством журналов отладки, чтобы вы могли узнать, в каком месте код перестает выполняться. Или подключите отладчик и отключите все исключения первого шанса.

1 голос
/ 06 мая 2010

Возможно, выбрасывается одно из неуловимых исключений , включая переполнение стека или Недостаточно памяти . Это самые сложные исключения для отслеживания.

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

...