MathNet.Numerics.dll

时间:2018-06-21 21:42:03

标签: mathnet mathdotnet

我是一名新手程序员,但是我设法使用MathNet.Numerics创建了多个成功的项目。但是,在目前的工作中,我遇到了主题错误,无法理解如何诊断或解决该问题。

一些症状。...

  • 程序在VB.net中。我有一个导入MathNet.Numerics.LinearAlgebra.Double
  • 的类
  • 每个Environment.ProcessorCount我有8个可用的内核
  • 当我尝试通过从即时窗口中调用子例程来使用Visual Studio Express 2015进行调试时,我得到以下信息:
  

引发的异常:“ System.Threading.ThreadAbortException”   MathNet.Numerics.dll评估需要一个线程来临时运行。   使用“监视”窗口执行评估。

调试器退出。

这里是一个简化的类,可以重现问题。...

Imports MathNet.Numerics.LinearAlgebra.Double

Public Class SimpleMathNetFail

    Private VectorArrayDeclaredAtModuleLevel(,)() As DenseVector
    Private i, j, k, l As Integer

    Public Sub New()

        ReDim VectorArrayDeclaredAtModuleLevel(1, 1)

        For i = 0 To 1
            For j = 0 To 1
                ReDim VectorArrayDeclaredAtModuleLevel(i, j)(2)
                For k = 0 To 2
                    VectorArrayDeclaredAtModuleLevel(i, j)(k) = 
                        New DenseVector(4)
                    For l = 0 To 3
                        VectorArrayDeclaredAtModuleLevel(i, j)(k)(l) = l
                    Next l
                Next k
            Next j
        Next i

    End Sub

    Function ConsumeVectorArray(I1() As Integer, I2() As Integer) As Double

        Dim DummyHolder As Double = 0

        DummyHolder = VectorArrayDeclaredAtModuleLevel(I1(0), I1(1))(I1(2)) * 
                      VectorArrayDeclaredAtModuleLevel(I2(0), I2(1))(I2(2))

        Return DummyHolder
    End Function
End Class

这是一个子例程,当从“即时窗口”中调用该子例程时,确实会导致问题。...

Sub TestMathNetFail()
    Dim MyFailtest As New SimpleMathNetFail

    Dim I1() As Integer = {0, 0, 0}
    Dim I2() As Integer = {1, 1, 0}
    Dim DummyResult As Double

    DummyResult = MyFailtest.ConsumeVectorArray(I1, I2)

End Sub
  • 问题并非每次都会发生。有时,我可以在TestMathNetFail的End Sub之前设置断点,它会按计划运行。
  • 如果我未设置任何断点,即从不进入调试,则不会发生异常。
  • 似乎Vector乘法步骤是最常引起问题的步骤。如果我消除那条线,我不会遇到问题。如果我在此行之前中断,则不会出现问题。
  • 我尝试修改Visual Studio的调试选项以禁用属性评估和其他隐式函数调用。这似乎与问题有关,使代码不太可能引发错误,但仍不能消除问题。
  • 如果在执行这些行之前通过断点停止执行,并且我手动单击“本地窗口”中的求值按钮以查找将在下一行中使用的变量,似乎可以实现一些改进
  • 我还尝试将Mathnet.Numerics.Control.MaxDegreeOfParallelism设置为小于我的处理器数量(低至一个)的数字,希望这将始终为我提供一个自由线程,但这似乎并不能改善情况。实际上,在代码中包含此语句似乎实际上增加了具有异常的可能性

我认为这个网站的本质是问题,但是我仍然不清楚如何解决我的问题。

https://blogs.msdn.microsoft.com/eliofek/2012/12/12/why-do-we-get-the-function-evaluation-requires-all-threads-to-run/

特别是指向底部的部分 “即使您从未亲自调用过此方法,如果看到此消息怎么办?”

当我阅读本文时,似乎问题可能与MathNet.Numerics内部的编码有关,我很犹豫尝试调试自己。我将进一步探讨提到的有关“热身”的想法,但是目前我尚不清楚这意味着什么。

任何关于为什么会引发此异常以及我将采取何种补救措施的想法都将不胜感激。

0 个答案:

没有答案