Есть следующий код:
public partial class MainWindow : Window
{
List<ManualResetEvent> events = new List<ManualResetEvent>();
public MainWindow()
{
InitializeComponent();
test();
}
public void test()
{
var resetEvent = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(
arg =>
{
HandleConnection();
resetEvent.Set();
});
events.Add(resetEvent);
}
public void HandleConnection()
{ }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
WaitHandle.WaitAll(events.ToArray());
}
}
При закрытии окна, все выглядит хорошо, окно закрывается. Но если в MainWindow() добавить вызов test() еще раз, то при закрытии окна, приложение зависает.
Помогите, пожалуйста, разобраться, в чем дело и как это поправить. Я так понимаю, что зависание вызвано тем, что WaitAll() не завершается из-за того, что не для всех элементов списка events вызывается Set() и скорей всего, это связано с некорректным добавлением ManualResetEvent в список.
Нашел ответ здесь: http://stackoverflow.com/questions/4239609/c-sharp-threads-waithandle-waitall
WaitHandle.WaitAll() не работает в STAThread в случае, если количество ожидаемых элементов ManualResetEvent больше одного.
По ссылке выше так же приведено альтернативное решение, которое помогло разобраться с проблемой.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники