Точка останова не достигнута, а код не выполнен? - PullRequest
0 голосов
/ 17 декабря 2010

Я столкнулся с проблемой, которую, похоже, не могу обернуть.

private void IndexEntityType(Type targetType, bool onlyNew)
{
    Logger.Debug("generating index for {0}", targetType);

    using (var wrapper = SessionWrapper.For(targetType, true))
    {
        var session = wrapper.Session;
        session.FlushMode = FlushMode.Never;
        session.CacheMode = CacheMode.Ignore;

        var entities = GetEntities(targetType, onlyNew, session);
        Logger.Debug("Indexing {0} entities", entities.Count);

        // Create a Full Text session.
        using (var fullTextSession = Search.CreateFullTextSession(session))
        using (var transaction = fullTextSession.BeginTransaction())
        {
            fullTextSession.CacheMode = CacheMode.Ignore;

            foreach (var entity in entities)
            {
               fullTextSession.Index(entity);
            }

            try
            {
                transaction.Commit();
            }
            catch (Exception ex)
            {
                Logger.Error("could not commit fulltext session transaction", ex);
            }
        }

        Logger.Debug("generated index for {0}", targetType);
    }

    ReQueueTimers(onlyNew);
}

Я пытаюсь отладить это и установить точки останова в первой строке (Logger.Debug) и последней строке (ReQueueTimers).

Однако при пошаговом выполнении кода последний вызов (ReQueueTimers (onlyNew)) никогда не вызывается и не достигает точки останова. Как это может быть? Компилятор как-то "удаляет его при оптимизации"?

Есть ли у кого-нибудь намеки на то, что может вызвать такое поведение?

РЕДАКТИРОВАТЬ: Это выполняется в несколько потоков, если это может иметь какое-либо отношение к нему.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Возможно, ваш код выдает исключение - если что-то кроме transaction.Commit() выдает исключение, вызов ReQueueTimers не будет выполнен.Вы можете доказать это, заставив Visual Studio разбить все исключения CLR - в меню «Отладка» выберите «Исключения» и установите флажок «Брошенный» в строке «Исключения времени выполнения общего языка».Затем снова начните отладку.

С другой стороны, я иногда заставлял Visual Studio просто отказаться от пошагового выполнения кода на полпути отладки метода.Может быть, в этом причина - это может быть связано с несколькими потоками.Если вы удалите первую точку останова и оставите ее в вызове ReQueueTimers, будет ли это иметь значение?

1 голос
/ 08 апреля 2011

У меня была та же самая проблема с 2 днями, и я до смерти ломал голову до ... Я нашел это где-то в сети:

Убедитесь, что ваш целевой код действительно создается, когда вы собираетерешение / проект. Для этого перейдите в Build-> Configuration Manager и убедитесь, что соответствующий проект отмечен (в крайнем правом столбце).

Имейте в виду, по какой-то загадочной причине, о которой знает только Гейтс, ящик был снят!

1 голос
/ 17 декабря 2010

Как небольшое дополнение к тому, что сказал Грэм:

Если вы работаете в нескольких потоках, и в этом потоке возникает исключение, которое не перехватывается, поток прерывается.

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