2013-01-25 4 views
1

기본적으로 내 WinRt 앱에 대한 인증 프로세스를 동 기적으로 실행하려하지만 시도한 모든 항목이 MainPage에서 권한 부여 후 응용 프로그램에 교착 상태가되어 HomePage 로의 탐색을 방해합니다. 그것을 알아낼 수 없습니다. 다음은 수정하지 않고 내 코드입니다. 아래에서 완벽하게 비동기 적으로 작동합니다. 나는 기적이 일을 할 수있는 방법 : 클래스 WinRt의 동기 권한

: MainPage.xaml.cs를에서 메소드를 호출

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); 
       }); 
    } 

코드 : 그래서 궁극적으로

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


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

답변

0

을 내 솔루션은 네비게이션을 처리했다 비동기 twitAuth.InitializeTwitterAsync() 메소드 내부. 네비게이션을 작동 시키려면 사용자 정의 클래스에서 탐색 할 수있는 app.xaml.cs에서 정적 프레임 속성을 만들어야했습니다. 이 링크 WinRt page navigaiton을 참조하십시오.

3

수 없습니다. Asyncouse API는 비동기 적으로 실행되도록 의도되었으며 스레드가 결과를 기다리도록 만들려고하면 API 자체가 종종 차단하려는 스레드에서 무언가를 실행해야하므로 종종 교착 상태가됩니다. 당신은 그것을 싸우려고하지 말고 오히려 당신이 해결하려고하는 실제 문제가 무엇인지 생각해야합니다. 귀하의 경우에는

당신이 기다려온 할 수 있도록

public async Task InitializeTwitterAsnc() 

public async void 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)); 
} 
+0

와우 , 전에는 그것을 보지 못했습니다. 저의 관심을 가져 주셔서 감사합니다. 나는 처음에는 문제를 생각하고 처음에는 비동기와 모든 것에 익숙하지 않은 것으로 생각한다. – user1206480

+0

비동기 방식이 아닌 방법으로 정확히 대기 상태를 사용하고 있습니까? – SBoss

+0

네 말이 맞아, 나는 서명을 업데이트하지 않았다. 이제 할거야. –