【问题标题】:Waiting for event to be handled等待事件处理
【发布时间】:2011-07-07 17:46:23
【问题描述】:

我有一个函数,我们称之为 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;
    }

【问题讨论】:

  • Func2 是否在 Func1 之外的另一个线程上运行?

标签: c# events wait


【解决方案1】:

您可以使用AutoResetEvent 类。用var evt = new AutoResetEvent(false); 实例化它,在你想等待的地方调用evt.WaitOne(),在你想发出等待代码可以继续的信号的地方调用evt.Set();。

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

【讨论】:

  • 说实话我没能成功实现它。将其添加到代码 Finc1 后,永远不会到达返回值的行
  • @Toni:你在哪里给evt.WaitOne() 和evt.Set() 打了电话?你确定你在AutoResetEvent 的同一个实例上调用这两个方法吗(这很关键)?
  • 我(至少我是这么认为的)我会在单独的项目中尝试来自 MSND 的示例并检查发生了什么
【解决方案2】:

一个简单的信号量还不够吗?

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多