我正面临着一个似乎无法解决的问题。
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)),也不会触及断点。怎么可能?编译器“在优化时以某种方式将其删除”吗?
有没有人对可能触发此行为的内容有任何暗示?
编辑:如果可能与它有任何关系,则在多个线程中运行。
答案 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并确保选中相应的项目(最右边)柱)。
请注意,由于只有盖茨知道的一些神秘的原因,这个盒子没有被检查!