等待内部方法直到捕获事件
我在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
它。