我面临着一个我似乎无法解决的问题。
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))永远不会被调用,也不会命中断点。怎么可能呢?编译器是否以某种方式“在优化时删除它”?
有人知道什么可能会触发这种行为吗?
编辑:如果这可能与它有关,那么它会在多个线程中运行。
您的代码可能会引发异常 - 如果
transaction.Commit()
之外的任何其他内容引发异常,则不会进行 ReQueueTimers 调用。您可以通过让 Visual Studio 中断所有 CLR 异常来证明这一点 - 在“调试”菜单中,选择“异常”,然后选中“公共语言运行时异常”行上的“引发”框。然后再次开始调试。
另一方面,我有时会让 Visual Studio 在调试方法的过程中中途放弃单步执行代码。也许这就是原因——它可能与多线程有关。如果删除第一个断点并将其保留在 ReQueueTimers 调用上,这有什么区别吗?
作为格雷厄姆所说的一点补充:
如果您在多个线程上运行并且该线程上抛出异常并且未被捕获,则该线程将被中止。
我在两天内遇到了同样的问题,并且把我的头撞死了,直到......我在网上的某个地方发现了这个:
确保在构建解决方案/项目时实际构建了目标代码。为此,请转到“构建”->“配置管理器”并确保选中相应的项目(在最右侧的列中)。
请注意,由于某些只有盖茨知道的神秘原因,该框未被选中!