Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

WaitHandle.WaitAll в Closing (C# WPF)

#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 больше одного. По ссылке выше так же приведено альтернативное решение, которое помогло разобраться с проблемой.

Комментариев нет:

Отправить комментарий