#c# #.net #multithreading #vstest #vstest.console.exe
#c# #.net #многопоточность #vstest #vstest.console.exe
Вопрос:
Мы используем Visual Studio test Framework и C # для написания модульных тестов, и недавно мы столкнулись с проблемой, когда vstest.console.exe иногда зависает после выполнения всех тестов. Все тесты проходят, но затем vstest.console.exe просто сидит там вечно, ожидая чего-то, вместо того, чтобы выйти.
Вероятно, это связано с недавними изменениями, когда мы начали использовать стороннюю библиотеку. При запуске тестов в debug мы можем видеть, что несколько потоков, созданных этой библиотекой, все еще зависают после того, как все тесты уже пройдены.
Чтобы лучше понять проблему, я попытался воспроизвести проблему, как показано в тестовом коде ниже. Однако, похоже, что vstest.console.exe совершенно счастлив выйти после завершения подобного теста. Похоже, его не волнуют какие-либо «дикие» потоки, которые все еще выполняются. Итак, мой вопрос заключается в следующем: что заставляет vstest ждать или не ждать потоков после выполнения всех тестов? Другими словами, как мне изменить приведенный ниже тест, чтобы vstest зависал после его завершения?
[TestMethod]
public void FreezeVSTest()
{
var thread = new Thread(
new ThreadStart(
delegate
{
while (true)
{
Thread.Sleep(1);
}
}));
thread.Start();
}
(Обратите внимание, что я не спрашиваю, как заставить тест зависнуть, я знаю, что добавление потока.Join() достигнет этого. Вопрос в том, что сам vstest зависает после прохождения теста.)
Комментарии:
1. Фоновые потоки , подобные вашему, не проблема, передний план вызовет замораживание. В любом случае бесконечный цикл без сигнала при закрытии — плохая идея. Не могли бы вы уточнить, какой тест у вас есть, какая библиотека и т.д.?
2. @Sinatr: цель этого вопроса — не найти решение конкретной проблемы, с которой мы столкнулись напрямую, а скорее понять принципы проблемы. Я надеюсь получить лучшее представление о том, какие ситуации приводят к зависанию vstest, и, надеюсь, это понимание приведет к возможным решениям.
3. Но если вы хотите знать, библиотека из Essential Objects . Мы вызываем его в тесте для преобразования HTML в PDF.
4. @Sinatr: Это не фоновый поток. Может быть, пример не вызывает проблемы, потому что сама переменная потока выходит за пределы области видимости? Попробуйте сохранить экземпляр потока в статическом элементе.
5. @PMF: Я протестировал это, но сохранение ссылки на поток в статическом элементе не имело значения.