有时当我使用 ILMath 等函数时ILMath.linspace
,会在没有明显原因的情况下抛出以下异常。
System.TypeInitializationException was unhandled by user code
HResult=-2146233036
Message=The type initializer for 'ILNumerics.Misc.ILThreadPool' threw an exception.
Source=ILNumerics
TypeName=ILNumerics.Misc.ILThreadPool
StackTrace:
at ILNumerics.Misc.ILThreadPool.Wait4Workers(Int32& workerCount)
at ILNumerics.ILMath.multiplyElem(ILInArray`1 A, ILInArray`1 B)
at ILNumerics.ILDenseArray`1.op_Multiply(ILDenseArray`1 A, ILDenseArray`1 B)
at ILNumerics.ILMath.linspace[T](ILBaseArray start, ILBaseArray end, ILBaseArray length)
at ILNumerics.ILMath.linspace(ILBaseArray start, ILBaseArray end, ILBaseArray length)
at *** in ***\Numerics\NumericsTest.cs:line 104
at *** in ***\Numerics\NumericsTest.cs:line 94
InnerException: System.ComponentModel.Win32Exception
HResult=-2147467259
Message=The parameter is incorrect
Source=System
ErrorCode=-2147467259
NativeErrorCode=87
StackTrace:
at System.Diagnostics.ProcessThread.set_ProcessorAffinity(IntPtr value)
at ILNumerics.Misc.ILThreadPool..ctor(Int32 maxThreads)
at ILNumerics.Misc.ILThreadPool..cctor()
InnerException:
通过反复试验,我意识到如果我设置了ILNumerics.Settings.UseThreadAffinity = false
,那么代码就会毫无错误地执行。我从 ILNumerics 文档中读到UseThreadAffinity
应该默认为 false,在我的情况下,默认情况下它肯定设置为 true。这是一个错误吗?另一个问题我注意到文档还提到我可以使用 App.config 来更改默认设置,我尝试过并且ILNIsHosted
实际上按照它说的做,但ILNUseThreadAffinity
对UseThreadAffinity
设置没有任何影响。即使我尝试将其设置为假,它仍然是“真”。这是 ILNumerics 的错误吗?我正在使用直接从 NuGet 获得的 ILNumerics 3.2.2.0(任何 CPU)。该代码在 Windows 7 64 位的 VS2010 中运行。
<appSettings>
<add key="ILNIsHosted" value="true" />
<add key="ILNUseThreadAffinity" value="false"/>
</appSettings>
为了补充原来的问题,我去下载 ILNumerics 社区版的源代码,发现了一些奇怪的东西。
ILSettings.cs 包含以下内容:
public static bool UseThreadAffinity {
get { return s_isHosted; }
set { s_isHosted = value; }
}
这些行对我来说没有意义。为什么 UseThreadAffinity 设置为 s_isHosted。我认为这可能是为什么当我将 ILNIsHosted 设置为 true 时,线程关联也更改为 true。