断点未命中且代码未执行?

时间:2010-12-17 09:23:43

标签: c# multithreading debugging compiler-construction

我正面临着一个似乎无法解决的问题。

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 个答案:

答案 0 :(得分:3)

可能是您的代码抛出异常 - 如果transaction.Commit()以外的任何内容抛出异常,则不会进行ReQueueTimers调用。您可以通过让Visual Studio中断所有CLR异常来证明这一点 - 在Debug菜单中,选择“Exceptions”,然后选中“Common Language Runtime Exceptions”行中的“Thrown”框。然后再次开始调试。

另一方面,我有时让Visual Studio只是通过调试方法中途放弃代码。也许这就是原因 - 它可能与多个线程有关。如果删除第一个断点并将其保留在ReQueueTimers调用中,这会有什么不同吗?

答案 1 :(得分:1)

作为格雷厄姆所说的一点点补充:

如果您在多个线程上运行并且该线程上引发了异常而未被捕获,则该线程将被中止。

答案 2 :(得分:1)

我从2天起就遇到了同样的问题,并且直到......我在网上找到了这个问题:

确保在构建解决方案/项目时实际构建目标代码。为此,请转到Build-> Configuration Manager并确保选中相应的项目(最右边)柱)。

请注意,由于只有盖茨知道的一些神秘的原因,这个盒子没有被检查!