2013-05-31 45 views
10

我有一個windows服務,使用單一類ThreadQueue<T>。當服務啓動時,它會調用ThreadQueue<string>.Start(),然後該類將接受並排隊將任務限制爲可配置數量的線程的任務。奇怪的系統.__佳能異常

ThreadQueue<string>.Start()在服務啓動時只調用一次。

有時,運行後我收到以下異常服務的幾個小時:

Application: myservice.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.NullReferenceException 
Stack: 
    at Apollo.Business.Framework.Threading.ThreadQueue.ThreadQueue`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Start() 
    at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ThreadHelper.ThreadStart() 

什麼是System.__Canon,什麼是在進行此調用這個傳遞的類型參數?

任何人都可以擺脫任何光線?

+1

您是否嘗試在'Debug'模式下編譯它? – Ofiris

+0

它已經是,你爲什麼這麼問? – jaywayco

回答

17

您應該而不是讀取方法參數類型名稱中的任何內容。 System .__ Canon是與泛型在CLR中實現的相關的實現細節。我不知道它的確切用法,但強烈懷疑它是由.NET中的優化工具Ngen.exe使用的,它用於預先拼裝程序集。泛型是pre-jitting中的一個問題,因爲具體類型是在運行時實例化的。你將得到一個方法的多個副本,該方法接受一個類型參數的參數類型。只需一個方法可處理任意引用類型,每種值類型的附加方法(如果有)。 System .__ Canon可以作爲任何引用類型的佔位符的替換類型,允許Ngen.exe預先指定該方法,即使它無法猜測運行時將使用的實際類型。類似的東西。

這款鞋子適合Apollo.Business.Framework.Threading.ThreadQueue聽起來像是一種框架樣式庫中存在的類,它會在安裝時進行預先拼接,因爲它意圖被多個程序使用。

因此,忽略類型名稱,關注實際的異常。當然,NullReferenceException是一個非常普遍的例外。堆棧跟蹤中沒有任何內容可以顯示什麼會導致它的提示。我猜想這個「Apollo」框架有一個初始化問題,一些對象應該有一個值,但仍然爲空。查看ThreadQueue構造函數的源代碼應該給出提示。如果您沒有,請致電供應商尋求幫助。 8年前版本的抖動中的一個錯誤並不能很好地解釋,這些錯誤早已修復。

7

既然運行時和框架已經開源,那麼回答這種類型的問題就容易得多。 __Canon的定義可用here。引用:

// Internal methodtable used to instantiate the "canonical" methodtable for generic instantiations. 
// The name "__Canon" will never been seen by users but it will appear a lot in debugger stack traces 
// involving generics so it is kept deliberately short as to avoid being a nuisance. 

[Serializable] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
[System.Runtime.InteropServices.ComVisible(true)] 
internal class __Canon 
{ 
} 

正如註釋所解釋的,它是泛型的實現細節,是「canonical」的縮寫。