Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin.iOS异步ViewDidLoad_C#_Xamarin.ios_Async Await_Msal - Fatal编程技术网

C# Xamarin.iOS异步ViewDidLoad

C# Xamarin.iOS异步ViewDidLoad,c#,xamarin.ios,async-await,msal,C#,Xamarin.ios,Async Await,Msal,我正在使用Microsoft身份验证库和Azure AD B2C为我的移动应用程序提供登录。这样,我就可以提供一个带有异步事件处理程序的按钮来启动登录过程: // iOS example public override void ViewDidLoad() { base.ViewDidLoad(); LoginButton.TouchUpInside += async (sender, e) => { try {

我正在使用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返回方法上使用async,但在这种情况下,我需要在
ViewDidLoad()
上使用async。如果我接受任何例外情况,这是否可以接受

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

我会这样做:

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

您可以将其封装为一个扩展方法,以便更易于使用

这是否应继续导致TaskCanceledException?这就是我看到的,不应该。continueWith是在任务完成后调用的。收到的参数是上一个任务。成功案例会导致TaskCanceledException…至少是现在编写代码的方式。