2016-07-27 10 views
2

Microsoft認証ライブラリとAzure AD B2Cを使用して、モバイルアプリケーションのログインを提供しています。そのことを私は、ログインプロセスを開始します非同期イベントハンドラでボタンを提供することができます。Xamarin.iOS async ViewDidLoad

// iOS example 
public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    LoginButton.TouchUpInside += async (sender, e) => 
    { 
     try 
     { 
      await app.AcquireTokenAsync(...); 
     } 
     catch(Exception e) 
     { 
     } 
    } 
} 

最初のアプリを開いて、私は黙ってAcquireTokenSilentAsyncを使用して、それらを記録することができるようにする必要があります。イベントハンドラでない限り、voidを返すメソッドでasyncを使用しないでください、というメッセージがたくさんありましたが、この場合はViewDidLoad()で処理する必要があります。私が何か例外を飲み込んだらこれは受け入れられますか?ここで

// is async void okay in this scenario? if not, where else can I put it? 
public async override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 


    try 
    { 
     await app.AcquireTokenSilentAsync(...); 
    } 
    catch(Exception e) 
    { 
     // swallow 
    }  
} 

答えて

0

は、私はそれを行うだろうかです:

try 
{ 
    await app.AcquireTokenSilentAsync(...).ContinueWith(
       t => 
       { 
        if (t.Exception != null) 
        { 
         t.Exception.Handle(
          ex => 
          { 
           if (ex is TaskCanceledException) 
           { 
            Console.WriteLine("Task cancelled {0}", ex); 
           } 
           else 
           { 
            Console.WriteLine(ex); 
           } 
           return false; 
          }); 
        } 
       }, 
       TaskContinuationOptions.OnlyOnFaulted);; 
} 
catch(Exception e) 
{ 
    /Console.WriteLine(ex); 
} 

あなたが使いやすいそうです拡張メソッドとしてそれをカプセル化することができます。

+0

これは続行する必要がありますか?TaskCanceledExceptionが発生していますか?それは私が見ているものです – Dismissile

+0

すべきではありません。タスクが完了すると、continueWithが呼び出されます。受信したパラメータは前のタスクです。 – Lineker

+0

成功事例は、少なくともコードが書かれた方法でTaskCanceledExceptionを引き起こします。 – Dismissile