Есть следующий код:
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
больше одного.
По ссылке выше так же приведено альтернативное решение, которое помогло разобраться с проблемой.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Допустим, были сгенерированы Классы-сущности и мне захотелось расширить какую-то сущность дополнительными полями(Например, вспомогательными...
В моем ListView с кнопками по непонятной мне причине, не хочет работать скролл Вот Listview