1

なぜこれが起こっているのか理解できたと思うので、私の質問は、どうすればコードを変更して、自分が望むように動作させることができるかということだと思います.

まずはコード。

private void btnLiveSignin_Click(object sender, RoutedEventArgs e)
{
    var LoggedIn = Login();

    busy.Visibility = System.Windows.Visibility.Visible;  // Display the please wait message

    if (LoggedIn.Result)
    {
        // Do something 
    }
}

public async Task<bool> Login()
{
    try
    {
        var e = await lac.InitializeAsync(Scopes);

        if (e.Status == LiveConnectSessionStatus.Connected)
        {
            client = new LiveConnectClient(e.Session);

            // do some stuff now that we are connected

            return true;
        }
        else
        {
            // not connected so do something

            return false;
        }
    }
    catch (Exception ex)
    {
        return false;
    }
}

基本的に、ユーザーがボタンをクリックすると、Windows Live アカウントにログインし、その間、ユーザーに待機を求めるメッセージが表示されます。

ご想像のとおり、UI がロックされているため、メッセージは表示されません。UI がロックされないように変更するにはどうすればよいですか?

SDKは非同期を使用しなかったため、イベントを使用する前にWindows Phone 7.5でこれを行いましたが、それは完全に正常に機能しました。これには、非同期とイベントの混合が必要ですか?

4

2 に答える 2

2

ハンドラーに欠けているのはasyncandawaitです。

Loginメソッドを async としてマークし、タスクを返すようにしたため、 awaitableにしました。これにより、イベント ハンドラーを次のように書き直すことができます。

private async void btnLiveSignin_Click(object sender, RoutedEventArgs e)
{
    var loginTask = this.Login();

    busy.Visibility = System.Windows.Visibility.Visible; 

    await loginTask;

    if(loginTask.Result)
    {
       // Do something 
    }
}

イベント ハンドラーを as としてマークするasyncと、非同期で完了することが呼び出し元に示されます。await続行する前にタスクが完了するのを待つ必要があるという「シグナル」です。これは、イベント ハンドラーが「不完全な」結果をディスパッチャー (UI スレッド) に返すことができることを意味します。これは、UI を中断することなくバックグラウンドで実行されます。

原則として、コード内でasyncandawaitを使い始めたら、それらを「最後まで」使用してみてください。

asyncコンパイラがそれらをawait「実際の」コードに変換する方法が少しよこしまなので、それらを完全に理解するためにトピックの周りを読む必要があるとしても驚かないでください.

于 2013-02-05T16:35:49.637 に答える
1

awaitブロッキング待機を実行するのではなく、タスクを実行する必要があります(これは必要ですResult)。

private async void btnLiveSignin_Click(object sender, RoutedEventArgs e)
{
    busy.Visibility = System.Windows.Visibility.Visible;  // Display the please wait message

    if(await Login())
    {
       // Do something 
    }
}
于 2013-02-05T16:33:30.360 に答える