2013-02-05 6 views
1

이제이 문제가 발생하는 이유를 이해할 수 있다고 생각합니다. 내 질문은 내가 원하는 방식으로 코드를 수정하는 방법입니다.라이브 연결 - 비동기 및 차단 UI 대기

먼저 코드를 입력하십시오. 사용자가 버튼을 클릭 할 때

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

기본적으로는 윈도우 계정을 살기에 그들을를 기록하고 그 메시지를 무슨 일이 일어나고있는 동안은 기다려주십시오하도록 사용자에게 요청하는 표시됩니다.

메시지가 표시되지 않도록 UI 잠금을 추측 할 수 있습니다. UI가 잠기지 않도록 어떻게 변경합니까?

Windows Phone 7.5에서이 작업을 수행하기 전에 이벤트를 사용하기 전에 sdk가 비동기를 사용하지 않았으므로 완벽하게 작동합니다. 이것은 asyncing과 이벤트가 혼합되어 있어야합니까?

답변

2

당신이 당신의 핸들러에서 놓치고 무엇 asyncawait입니다. 표시

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

: 당신이 비동기 같은 Login 방법을 표시하고 작업을 반환했다

때문에, 당신은 그것을 가능한 이벤트 핸들러를 다시 작성하게하는, 그것을 awaitable를했습니다 async과 같은 이벤트 핸들러는 호출자에게 비동기 적으로 완료됨을 나타냅니다. await은 작업이 완료되기를 기다리기를 기다리는 "신호"입니다. 함께 이벤트 처리기는 "불완전한"결과를 UI를 방해하지 않고 백그라운드에서 실행할 디스패처 (UI 스레드)로 되돌릴 수 있음을 의미합니다.

코드에서 일반적으로 asyncawait을 사용하기 시작한 후에는 "전체적으로 사용 중지"해야합니다.

asyncawait은 컴파일러가이 코드를 "실제"코드로 바꾸는 방법에 대해 약간 싫어하므로 완전히 이해하기 위해 주제를 자세히 읽어야 할 경우 놀라지 마십시오.

+0

지금 시도해 보겠습니다. 환호 – Gaz83

+0

고맙습니다. – Gaz83

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 
    } 
} 
+0

지금 시도해 보겠습니다. 환호 – Gaz83