#c_sharp #wpf #многопоточность
Есть следующий код:
public partial class MainWindow : Window
{
List events = 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 больше одного. По ссылке выше так же приведено альтернативное решение, которое помогло разобраться с проблемой.
Комментариев нет:
Отправить комментарий