2016-07-27 30 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