#c_sharp #wpf #многопоточность
Есть следующий код: public partial class MainWindow : Window { Listevents = new List (); 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 в список.
Ответы
Ответ 1
Нашел ответ здесь: https://stackoverflow.com/questions/4239609/c-sharp-threads-waithandle-waitall WaitHandle.WaitAll() не работает в STAThread в случае, если количество ожидаемых элементов ManualResetEvent больше одного. По ссылке выше так же приведено альтернативное решение, которое помогло разобраться с проблемой.
Комментариев нет:
Отправить комментарий