等待事件被处理

5

我有一个函数,叫做Func1,它包含Func2和事件处理程序。

现在我想要实现的是,在Func2触发并处理事件之前,不让函数(Func1)返回值。

基本上,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;
    }

Func2在另一个线程上运行吗? - Florian Greinacher
3个回答

8
您可以使用 AutoResetEvent 类。使用 var evt = new AutoResetEvent(false); 进行实例化,在需要等待的地方调用 evt.WaitOne(),在需要发出信号以允许等待代码继续执行的地方调用 evt.Set();
如果您有许多涉及事件的“等待直到”情况,还可以查看 反应式扩展(Rx)

说实话,我没有成功地实现它。在将其添加到代码后,Finc1从未到达返回值的行。 - Toni
@Toni:你把evt.WaitOne()evt.Set()的调用放在哪里了?你确定你在同一个AutoResetEvent实例上调用了这两个方法(这很重要)? - Aasmund Eldhuset
我(至少我认为是这样)将在另一个项目中尝试MSND上的示例,并检查发生了什么。 - Toni

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

0

由于Func2在与Func1相同的线程上运行,因此Func1Func2返回之前不会返回。这意味着可以保证在将控制返回给Func1之前,Func2中触发的事件已经被触发。只需在调用Func2之前附加事件处理程序即可按预期工作。

在这种情况下,使用SemaphoreAutoResetEvent是过度的,因为两者都需要获取操作系统资源来管理线程同步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接