13

我有一个使用单例类的 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什么以及是什么使这个调用作为类型参数传入?

任何人都可以解释一下吗?

4

2 回答 2

24

您不应该方法参数类型名称中读取任何内容。System.__Canon 是与 CLR 中实现泛型的方式相关的实现细节。我不知道它的确切用法,但强烈怀疑它是由 Ngen.exe 使用的,Ngen.exe 是 .NET 中预装配程序集的优化工具。由于具体类型是在运行时实例化的,因此泛型在预抖动中是一个问题。您将获得采用类型参数的参数类型的方法的多个副本。只有一种方法可以处理任何引用类型,每个值类型的附加方法,如果有的话。System.__Canon 可以是任何引用类型的占位符的替代类型,即使 Ngen.exe 无法猜测在运行时将使用哪种实际类型,它也可以预置该方法。类似的东西。

鞋子很合适,Apollo.Business.Framework.Threading.ThreadQueue 听起来像是框架样式库中存在的那种类,它在安装时会被预先设置,因为它本来是供多个程序使用的。

所以忽略类型名称,关注实际异常。NullReferenceException 当然是一个非常常见的异常。堆栈跟踪中没有其他可见的东西可以提示导致它的原因。我猜想那个“阿波罗”框架的初始化问题,一些应该有一个值但仍然为空的对象。查看 ThreadQueue 构造函数的源代码应该会给出提示。如果没有,请致电供应商寻求帮助。一个 8 年老版本的 jitter 中的一个 bug 并不能很好地解释它,那些 bug 很久以前就已经修复了。

于 2013-05-31T11:26:37.813 回答
16

现在运行时和框架已经开源,回答这类问题要容易得多。__Canon 的定义可在此处获得。引用:

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

正如评论所解释的,它是泛型的实现细节,是“规范”的缩写。

于 2016-01-11T20:40:55.080 回答