2013-05-31 29 views
10

Tôi có dịch vụ cửa sổ sử dụng lớp singleton ThreadQueue<T>. Khi dịch vụ bắt đầu, thực hiện cuộc gọi đến ThreadQueue<string>.Start() lớp này sau đó chấp nhận và xếp hàng các tác vụ hạn chế đồng thời với một số chủ đề có thể cấu hình được.Hệ thống lạ .__ Ngoại lệ của Canon

ThreadQueue<string>.Start() được gọi một lần và chỉ một lần khi dịch vụ khởi động.

Thỉnh thoảng, sau một vài giờ sau khi dịch vụ đang chạy tôi nhận được ngoại lệ sau đây:

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 là gì và những gì đang thực hiện cuộc gọi này đi qua trong này như là một đối số kiểu?

Có ai có thể làm sáng tỏ không?

+1

Bạn đã cố biên dịch trong chế độ "Gỡ lỗi" chưa? – Ofiris

+0

Nó đã được, tại sao bạn hỏi điều đó? – jaywayco

Trả lời

17

Bạn nên không đọc bất kỳ điều gì trong tên loại đối số phương thức. System .__ Canon là một chi tiết thực hiện liên quan đến cách generics được thực hiện trong CLR. Tôi không biết sử dụng chính xác cho nó nhưng mạnh mẽ nghi ngờ nó được sử dụng bởi Ngen.exe, các công cụ tối ưu hóa trong NET mà trước khi jits hội đồng. Generics là một vấn đề trong pre-jitting kể từ khi loại bê tông được khởi tạo trong thời gian chạy. Bạn sẽ nhận được nhiều bản sao của một phương thức lấy kiểu đối số của tham số kiểu. Chỉ cần một phương pháp xử lý bất kỳ loại tham chiếu nào, phương pháp bổ sung cho từng loại giá trị, nếu có. Hệ thống .__ Canon có thể là loại thay thế là nơi giữ chỗ cho bất kỳ loại tham chiếu nào, cho phép Ngen.exe định sẵn phương thức đó mặc dù nó không thể đoán được loại thực tế nào sẽ được sử dụng trong thời gian chạy. Một cái gì đó như thế.

Phù hợp với giày, Apollo.Business.Framework.Threading.ThreadQueue có vẻ giống như loại lớp hiện diện trong thư viện kiểu khung sẽ được cài sẵn khi được cài đặt vì nó được sử dụng bởi nhiều chương trình .

Vì vậy, hãy bỏ qua tên loại, hãy tập trung vào ngoại lệ thực tế. NullReferenceException là rất ngoại lệ phổ biến của khóa học. Không có gì là có thể nhìn thấy từ ngăn xếp dấu vết đó sẽ cung cấp cho một gợi ý những gì gây ra nó. Tôi đoán tại một vấn đề khởi tạo với khuôn khổ "Apollo", một số đối tượng cần phải có một giá trị nhưng vẫn là null. Có một cái nhìn tại mã nguồn cho constructor ThreadQueue nên đưa ra một gợi ý. Một cuộc gọi đến nhà cung cấp để được trợ giúp nếu bạn không có nó. Một lỗi trong một phiên bản 8 tuổi của jitter không giải thích rõ ràng, những lỗi này đã được sửa chữa từ lâu rồi.

7

Bây giờ, thời gian chạy và khung công tác đã được mở nguồn, sẽ dễ dàng hơn để trả lời loại câu hỏi này. Định nghĩa __Canon có sẵn here. Trích dẫn:

// 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 
{ 
} 

Như nhận xét giải thích, đây là chi tiết triển khai cho generics và viết tắt là "kinh điển".

Các vấn đề liên quan