C# Xamarin.iOS异步ViewDidLoad
我正在使用Microsoft身份验证库和Azure AD B2C为我的移动应用程序提供登录。这样,我就可以提供一个带有异步事件处理程序的按钮来启动登录过程: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 {
// 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…至少是现在编写代码的方式。