等待事件处理

时间:2011-07-07 17:46:23

标签: c# events wait

我有一个功能,我们称之为Func1和it contains Func2&事件处理程序。

现在我想要实现的是not let函数(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 个答案:

答案 0 :(得分:8)

您可以使用AutoResetEvent课程。使用var evt = new AutoResetEvent(false);对其进行实例化,在您要等待的地方调用evt.WaitOne(),并在evt.Set();处用信号表示等待代码可以继续进行。

如果您有许多涉及事件的“等待”情况,您还可以查看Reactive Extensions (Rx)

答案 1 :(得分:1)

一个简单的信号量不足以满足要求吗?

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;
}

答案 2 :(得分:0)

由于Func2Func1在同一个主题上运行,Func1Func2返回之前不会返回。这意味着可以保证在Func2中触发的事件在将控制权返回Func1之前被触发。只需在调用Func2之前附加您的事件处理程序,它应该按预期工作。

在这种情况下使用SemaphoreAutoResetEvent是过度的,因为它们都获取OS资源来管理线程同步。