2010-12-17 51 views
0

我正面臨一個我似乎無法控制我的頭的問題。斷點未命中且代碼未執行?

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

這可能是你的代碼拋出一個異常 - 如果除了transaction.Commit()以外的任何內容拋出異常,則不會進行ReQueueTimers調用。您可以通過讓Visual Studio打破所有CLR異常來證明這一點 - 在Debug菜單中,選擇「Exceptions」,並在「Common Language Runtime Exceptions」行中檢查「Thrown」框。然後再次開始調試。另一方面,我有時候有時候Visual Studio只是通過調試方法中途放棄代碼中間代碼。也許這是原因 - 它可能與多個線程有關。如果您刪除第一個斷點並將其保留在ReQueueTimers調用中,這是否有任何區別?

+0

好的,試過了,我確實得到了一些處理的異常,但沒有任何會破壞代碼的東西,據我所知。當步進時,它實際上在ReQueueTimers()(最後一個})之前行。我只是意識到,它一定是實際拋出異常的包裝器的設置......感謝提示! – jishi 2010-12-17 09:51:56

+0

如果拋出任何異常,那麼try語句代碼就不會發生,那麼代碼中的任何異常都會導致錯誤的行爲。 – 2010-12-17 18:29:01

1

作爲一個小除了什麼格雷厄姆說:

如果您在多個線程運行,並拋出一個異常對線程,而不是抓住了,該線程將被中止。

1

我2天有非常相同的問題,拍着我的頭,直到死......我發現在網絡上此地方:

確保您的目標代碼實際上建立,當你建立你的解決方案/項目。要做到這一點,轉到生成 - >配置管理器,並確保選中相應的項目(在最右邊的列)。

請注意,由於一些神祕的原因,只有蓋茨知道,這個盒子沒有被檢查!