11

我对 C# 中的一个方法有这个问题。我创建了一个从 dll 调用函数的方法,它调用的Phone.GetLampMode(); NowPhone.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();    
}
4

3 回答 3

10

一种解决方案是使用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以这样的方式穿线

于 2013-03-06T09:05:32.503 回答
3

您可以将处理程序包装在异步方法中,该方法应如下所示(未经测试):

public async Task<bool> checkLamp(int iLamp)
{
    Phone.ButtonIDConstants btn = new Phone.ButtonIDConstants();
    btn = Phone.ButtonIDConstants.BUTTON_1;
    btn += iLamp;

    var tcs = new TaskCompletionSource<bool>();
    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);

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

这是有关此问题的博客条目。请注意,框架 4.5 是必需的。

于 2013-03-06T09:17:01.150 回答
0

看起来现有模型接近基于事件的异步模式 (EAP)。您可能想查看与其他异步模式和类型互操作的文章,该文章描述了如何将这种模式转换为更新的基于任务的异步模式 (TAP)。

一旦你有一个Task(or Task<T>,你就可Wait以为它。

于 2013-03-06T09:14:02.547 回答