1

基本的に、WinRtアプリの承認プロセスを同期的に実行しようとしていますが、メインページでの承認後にアプリがデッドロックし、ホームページへのナビゲーションができなくなったようです。それを理解できないようです。これが変更なしの私のコードです。これは以下の非同期で完全に正常に機能します。これを同期的に機能させるにはどうすればよいですか?

クラス:

public async void InitializeTwitterAsnc()
    {

        WinRtAuthorizer authorizer = null;

        authorizer = new WinRtAuthorizer()
        {
            Credentials = new LocalDataCredentials()
            {
                ConsumerKey = "blah379",
                ConsumerSecret = "blah123"
            },
            UseCompression = true,
            Callback = new Uri("http://blah.com")
        };

        if(!authorizer.IsAuthorized)
        {
            await authorizer.AuthorizeAsync();
        }

        // set the twitter credential fields
        await Task.Run
            (() =>
                 {
                     twitterName = authorizer.Credentials.ScreenName;
                     twitterId = authorizer.Credentials.UserId;
                     accessToken = authorizer.Credentials.AccessToken;
                     oAuthToken = authorizer.Credentials.OAuthToken;

                     this.TwitterContext = new TwitterContext(authorizer);
                 });
    }

MainPage.xaml.csからメソッドを呼び出すコード:

private void StartTwitterLogin(object sender, RoutedEventArgs e)
    {
        // start the twitter authorization
        TwitterAuth twitAuth = new TwitterAuth();
        twitAuth.InitializeTwitterAsnc();


        this.Frame.Navigate(typeof (HomePage));
    }
4

2 に答える 2

3

できません。非同期 API は非同期で実行することのみを意図しており、スレッドに結果を強制的に待機させようとすると、ブロックしているスレッドで API 自体が何かを実行する必要があることが多いため、デッドロックが発生することがよくあります。それと戦おうとするのではなく、解決しようとしている実際の問題が何であるかを考えるべきです。

あなたの場合、メソッドの署名をから変更する必要があります

public async void InitializeTwitterAsnc()

public async Task InitializeTwitterAsnc()

待機してからここで待機できるようにします。

private async Task StartTwitterLogin(object sender, RoutedEventArgs e)
{
    // start the twitter authorization
    TwitterAuth twitAuth = new TwitterAuth();
    await twitAuth.InitializeTwitterAsnc();


    this.Frame.Navigate(typeof (HomePage));
}
于 2013-01-25T23:25:54.940 に答える
0

最終的に、私の解決策は、非同期の twitAuth.InitializeTwitterAsync() メソッド内でナビゲーションを処理することでした。ナビゲーションを機能させるには、app.xaml.cs に静的フレーム プロパティを作成し、ナビゲーション用のカスタム クラスで使用できるようにする必要がありました。このリンクWinRt page navigaitonを参照してください。

于 2013-01-25T23:24:14.457 に答える