WaitHandle.WaitAll в Closing (C# WPF)

267
09 декабря 2016, 08:47

Есть следующий код:

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 в список.

Answer 1

Нашел ответ здесь: http://stackoverflow.com/questions/4239609/c-sharp-threads-waithandle-waitall

WaitHandle.WaitAll() не работает в STAThread в случае, если количество ожидаемых элементов ManualResetEvent больше одного.

По ссылке выше так же приведено альтернативное решение, которое помогло разобраться с проблемой.

READ ALSO
WPF смена кнопок

WPF смена кнопок

Задача:

299
Парсинг динамического json на C#

Парсинг динамического json на C#

Здравствуйте, есть json объект типа:

303
Наследование в EntityFramework

Наследование в EntityFramework

Допустим, были сгенерированы Классы-сущности и мне захотелось расширить какую-то сущность дополнительными полями(Например, вспомогательными...

265
Не работает скролл в ListView

Не работает скролл в ListView

В моем ListView с кнопками по непонятной мне причине, не хочет работать скролл Вот Listview

276