等待内部方法直到捕获事件

我在C#中遇到了这个问题。 我做了一个方法,从一个名为Phone.GetLampMode();的DLL调用一个函数Phone.GetLampMode(); 现在Phone.GetLampMode不会返回任何内容。 在’ onGetLampModeResponse ‘事件中返回数据。 有没有办法可以在我的方法中等待,直到我从onGetLampModeResponse事件中获取数据?

 public bool checkLamp(int iLamp) { Phone.ButtonIDConstants btn = new Phone.ButtonIDConstants(); btn = Phone.ButtonIDConstants.BUTTON_1; btn += iLamp; Phone.GetLampMode(btn, null); return true; } private void Phone_OnGetLampModeResponse(object sender, Phone.GetLampModeResponseArgs e) { var test = e.getLampModeList[0].getLampMode.ToString(); } 

一种解决方案是使用AutoResetEvent

 public bool checkLamp(int iLamp) { Phone.ButtonIDConstants btn = new Phone.ButtonIDConstants(); btn = Phone.ButtonIDConstants.BUTTON_1; btn += iLamp; AutoResetEvent waitHandle = new AutoResetEvent(false); // Pass waitHandle as user state Phone.GetLampMode(btn, waitHandle); // Wait for event completion waitHandle.WaitOne(); return true; } private void Phone_OnGetLampModeResponse(object sender, Phone.GetLampModeResponseArgs e) { var test = e.getLampModeList[0].getLampMode.ToString(); // Event handler completed // I guess there is some UserState property in the GetLampModeResponseArgs class ((AutoResetEvent)e.UserState).Set(); } 

注意:广告你使用Phone作为静态类/变量,可以认为你正在开发Windows Phone …如果是这样,请注意WP和异步编程的整个概念是不锁定UI线程就是这样的

您可以将处理程序包装在异步方法中,该方法看起来像这样(未经测试):

 public async Task checkLamp(int iLamp) { Phone.ButtonIDConstants btn = new Phone.ButtonIDConstants(); btn = Phone.ButtonIDConstants.BUTTON_1; btn += iLamp; var tcs = new TaskCompletionSource(); var handler = (sender, e) => { Phone.OnGetLampModeResponse -= handler; var test = e.getLampModeList[0].getLampMode.ToString(); tcs.SetResult(true); }; Phone.OnGetLampModeResponse += handler; Phone.GetLampMode(btn, null); return tcs.Task; } 

在你的调用方法中,你会写:

 var returnValue = await checkLamp(iLamp); 

这样做的好处是,在进程等待响应时,您的用户界面不会阻塞。

这是关于这个问题的博客文章。 请注意,Framework 4.5是必需的。

看起来现有模型接近基于事件的异步模式(EAP)。 您可能希望查看文章Interop with Other Asynchronous Patterns and Types ,其中介绍了如何将此类模式转换为较新的基于任务的异步模式(TAP)。

一旦你有了一个Task (或Task ,你就可以Wait它。