2011-07-07 56 views
5

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

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

+0

nope它在相同的线程上运行 – Toni

回答

8

你可以使用AutoResetEvent类。使用var evt = new AutoResetEvent(false);进行实例化,请拨打evt.WaitOne()您想要等待的位置,然后拨打evt.Set();您希望发送等待代码的位置。

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

+0

说实话,我没有设法成功实现它。在将它添加到代码Finc1之后,永远不会返回到返回值的行 – Toni

+0

@Toni:你在哪里把调用放到了'evt.WaitOne()'和'evt.Set()'?你确定你在'AutoResetEvent'的同一个实例上调用了这两个方法吗?(这很重要)? –

+0

我(至少我是这么认为的)我会尝试从单独的项目的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在同一线程上运行为Func1Func1不会前Func2收益回报。这意味着可以保证在Func2中触发的事件在控制权返回到Func1之前被触发。在拨打Func2之前,只需附加您的事件处理程序,它应该按预期工作。

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