"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 числа, меньшие моего числа процессоров (всего один), в надежде, что это всегда оставит мне свободный поток, но, похоже, это не улучшит ситуацию. Фактически, включение этого утверждения в код, похоже, увеличивает шансы исключения
Этот веб-сайт, я думаю, понимает суть проблемы, но мне все еще не ясно, как решить мою проблему.
В частности, раздел внизу "Что если вы видите это сообщение, хотя вы никогда не вызывали этот метод самостоятельно?"
Когда я читаю это, кажется, что проблема может быть связана с кодированием внутри MathNet.Numerics, которое я не решаюсь пытаться отлаживать самостоятельно. Я буду далее исследовать упомянутую идею о "разогреве", но в настоящее время мне не совсем ясно, что это значит.
Буду очень признателен за любые идеи о том, почему это исключение может быть выброшено и что я могу сделать, чтобы исправить это.