Ожидание обработки события - PullRequest
5 голосов
/ 07 июля 2011

У меня есть функция, давайте назовем ее Func1 и it contains Func2 & обработчик событий.

Теперь я хотел бы достичь возвращаемого значения not let function (Func1), пока Func2 не сработает и не обработает событие.

В основном Func1 имеет строку в качестве возвращаемого значения, а строковое значение устанавливается внутри обработчика события.Поэтому мне нужно дождаться обработки события и затем вернуть значение.

Пример кода

    public static string Fun1 ()
    {
        string stringToReturn = String.Empty;
        Func2(); //Func2 will after few sec fire event bellow 

        example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
                               {
                                   stringToReturn = "example"; //this wont be hardcoded
                               };

        //wait for event to be handled and then return value
        return stringToReturn;
    }

Ответы [ 3 ]

8 голосов
/ 07 июля 2011

Вы можете использовать класс AutoResetEvent.Создайте его с помощью var evt = new AutoResetEvent(false);, позвоните evt.WaitOne(), где вы хотите ждать, и evt.Set();, где вы хотите указать, что код ожидания может продолжаться.

Если у вас есть много ситуаций ожидания до, которые включаютсобытия, вы также можете посмотреть в Reactive Extensions (Rx) .

1 голос
/ 07 июля 2011

Разве простого семафора не достаточно?

public static string Fun1 ()
{
    Semaphore sem = new Semaphore(1,1);

    string stringToReturn = String.Empty;
    Func2(); //Func2 will after few sec fire event bellow 

    example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
                           {
                               stringToReturn = "example"; //this wont be hardcoded
                               sem.Release();
                           };
    sem.WaitOne();

    //wait for event to be handled and then return value
    return stringToReturn;
}
0 голосов
/ 08 июля 2011

Поскольку Func2 работает в том же потоке, что и Func1, Func1 не вернется, пока не вернется Func2. Это означает, что гарантируется, что событие, сгенерированное в Func2, будет запущено до того, как оно вернет управление на Func1. Просто подключите ваш обработчик событий перед вызовом Func2, и он должен работать как положено.

Использование Semaphore или AutoResetEvent в этом сценарии излишне, так как оба получают ресурсы ОС для управления синхронизацией потоков.

...