3

我正在使用 Microsoft 身份验证库和 Azure AD B2C 为我的移动应用程序提供登录名。有了它,我可以提供一个带有异步事件处理程序的按钮,该处理程序将启动登录过程:

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

1 回答 1

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

您可以将其封装为扩展方法,因此更易于使用。

于 2016-07-29T14:56:28.337 回答