В потоке установлено значение ISBackground = true.
COM ничего не знает о вашем потоке, VB6, тем более что он вообще не поддерживает потоки. Установка для свойства Thread.IsBackground значения true указывает CLR, что можно прервать поток при выходе из основного потока программы. Поэтому неудивительно, что его внезапное прекращение без диагностики.
Вероятно, проблема с вашей переменной mRunning, ее нужно объявить volatile . То, как вы используете его в своем потоке, повышает вероятность того, что он никогда не увидит изменения в переменной в сборке Release. Оптимизатор джиттера должен оптимизировать код и загрузить значение переменной в регистр ЦП. Ключевое слово volatile предотвращает это.
Это все еще недоделанное решение, вам действительно следует использовать ManualResetEvent, чтобы сообщить о потоке. Вызовите его метод Set () в вашем методе Close (), WaitOne (0) в потоке, чтобы проверить его. Затем вам также придется ждать завершения потока, чтобы утилизация канала не бомбила код потока. Остерегайтесь тупика.
Теперь вам больше не нужен Thread.IsBackground, и вы получили лучший шанс отладить этот код. Следующее, что вам нужно сделать, это реализовать IDisposable и написать финализатор для вашего класса, чтобы гарантировать, что ваш код завершит свою работу должным образом, даже если клиентский код не вызвал метод Close (). Если не считать того, что вы просто забыли это сделать, это также необходимо, если клиентский код взорвался. Пусть ваш метод Close () вызовет Dispose (). Возможно, вы захотите сделать две разные вещи с конвейером в зависимости от того, нормально ли завершилось приложение. Реализуя шаблон Disposing, вы можете определить разницу между «хорошим» завершением (было вызвано «Close») и «плохим» (был вызван финализатор) с помощью аргумента располагающего .
Теперь ваш код устойчив в любом случае. Узнать, почему клиентский код не вызвал Close (), должно быть просто.