我有一个功能,我们称之为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 :(得分: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)
由于Func2
与Func1
在同一个主题上运行,Func1
在Func2
返回之前不会返回。这意味着可以保证在Func2
中触发的事件在将控制权返回Func1
之前被触发。只需在调用Func2
之前附加您的事件处理程序,它应该按预期工作。
在这种情况下使用Semaphore
或AutoResetEvent
是过度的,因为它们都获取OS资源来管理线程同步。