Повторное использование AutoResetEvent

Я новичок в многопоточности и должен понимать, как работает AutoResetEvent.

Я пытаюсь реализовать процесс оптимизации, при котором я отправляю данные между двумя разными программами и использую два потока: основной поток, в котором я изменяю и отправляю информацию, и поток получения, всегда работающий в фоновом режиме, ожидающий чтобы поймать сообщение с результатами отправленной информации. Чтобы реализовать это, после отправки сообщения я хочу, чтобы основной поток ждал, пока поток-получатель не получит обратно результат и не запустит событие, которое позволяет основному потоку продолжить с того места, где он остановился.

Вот упрощенная версия моего кода:

 // Thread 1 - MAIN

    static AutoResetEvent waitHandle = new AutoResetEvent(false);

    void foo()
    {
        for (int i = 0; i < 5; i++)
        {
            // ... Modify sendInfo data

            // Send data to other software
            SendData(sendInfo);

            // Wait for other software to process data and send back the result
            waitHandle.WaitOne();

            // Print Result
            print(receivedData);

            // Reset AutoResetEvent
            waitHandle.Reset();
        }
    }


    /////////////////////////////

    // Thread 2 - Receiver thread (running in the background)

    private event EventHandler MessageReceived;

    // ... Code for triggerring MessageReceived event each time a message is received

    private static void OnMessageReceived(object sender, EventArgs e)
    {
        waitHandle.Set();
    }

Мой вопрос:

Можете ли вы повторно использовать AutoResetEvent в таком цикле? Я правильно его использую?

Я почти уверен, что мой цикл отправки / получения работает правильно, и событие MessageReceived успешно сработало вскоре после отправленного сообщения. Но хотя мой код отлично работает на одной итерации, он застревает на нескольких итерациях, и я не уверен, почему. Какие-либо предложения?


person SofiaFeist    schedule 20.07.2020    source источник
comment
Можно использовать его несколько раз в цикле, однако похоже, что вы пытаетесь использовать AutoResetEvent как ManualResetEvent. stackoverflow.com/questions/153877/   -  person itsme86    schedule 21.07.2020
comment
О, ты прав. Спасибо за ваш комментарий!   -  person SofiaFeist    schedule 22.07.2020