11

C# のメソッドでこの問題が発生しました。呼び出された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();    
}
4

3 に答える 3

10

1つの解決策は、以下を使用すること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);

これには、プロセスが応答を待っている間、ユーザー インターフェイスがブロックされないという利点があります。

この問題に関するブログエントリは次のとおりです。Framework 4.5 が必要であることに注意してください。

于 2013-03-06T09:17:01.150 に答える
0

既存のモデルはイベント ベースの非同期パターン (EAP) に近いようです。このようなパターンを新しいタスクベースの非同期パターン (TAP) に変換する方法について説明している記事「他の非同期パターンおよびタイプとの相互運用」を参照することをお勧めします。

Task(またはを取得したら、そのためTask<T>だけWaitにできます。

于 2013-03-06T09:14:02.547 に答える