"System.Threading.ThreadAbortException" в MathNet.Numerics.dll

Я начинающий программист, но мне удалось создать несколько успешных проектов с использованием MathNet.Numerics. Однако в моем текущем усилии у меня возникают проблемы с темой, и я не могу понять, как диагностировать или обойти проблему.

Несколько симптомов....

  • Программа находится на VB.net. У меня есть класс, который импортирует MathNet.Numerics.LinearAlgebra.Double
  • У меня есть 8 доступных ядер, в соответствии с Environment.ProcessorCount
  • Когда я пытаюсь выполнить отладку с помощью Visual Studio Express 2015, вызывая подпрограмму из окна "Немедленно", я получаю следующее:

Возникло исключение: "System.Threading.ThreadAbortException" в MathNet.Numerics.dll. Для оценки требуется временно запустить поток. Используйте окно Watch, чтобы выполнить оценку.

в этот момент отладчик завершает работу.

Вот упрощенный класс, который воспроизводит проблему....

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

А вот подпрограмма, которая при вызове из Immediate Window надежно вызывает проблему...

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
  • Проблема не бывает каждый раз. Иногда я могу установить точку останова непосредственно перед End Sub TestMathNetFail, и она будет работать как запланировано.
  • Если я не установил точки останова, т.е. никогда не войду в отладку, исключение не произойдет.
  • Кажется, что шаг умножения Векторов - тот, который чаще всего вызывает проблему. Если я устраню эту строку, я не пойму проблему. Если я сломаюсь до этой линии, я не пойму проблему.
  • Я попытался изменить параметр отладки в Visual Studio, чтобы отключить оценку свойств и другие неявные вызовы функций. Похоже, это как-то влияет на проблему, делая код менее вероятным, чтобы вызвать ошибку, но все же это не устраняет проблему.
  • Кажется, что некоторое улучшение достигается, если перед выполнением таких строк выполнение останавливается через точку останова, и я вручную нажимаю кнопки оценки в окне Locals для переменных, которые будут использоваться в следующей строке
  • Я также попытался установить для 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 ответов

Другие вопросы по тегам