2016-07-27 61 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方法上使用異步,除非它是一個事件處理程序,但在這種情況下,我需要在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

應該這ContinueWith導致TaskCanceledException?這就是我所看到的 – Dismissile

+0

它不應該。在任務完成後,continueWith將被調用。收到的參數是上一個任務。 – Lineker

+0

成功案例導致TaskCanceledException ...至少現在編寫代碼的方式。 – Dismissile