1 回答
TA贡献1815条经验 获得超10个赞
在里面AggregateException有最初抛出的异常。这AggregateException就像一个包装器,用于在Task抛出 1 个或多个异常时(例如,当您链接任务时更多ContinueWith)。
https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.exception(v=vs.110).aspx
如果您真的想要抛出的异常,请使用GetAwaiter().GetResult()代替Wait()。
但是,在使用 Webforms 时避免使用Wait()on Task。让 Webforms 在页面生命周期挂钩中运行异步任务的最佳方法是将PageAsyncTask用作异步方法的包装器并使用RegisterAsyncTask(PageAsyncTask task). 此外,请确保您已在页面本身上指定了 Async="true" 属性。
包裹授权方法如下所示:RegisterAsyncTask(new PageAsyncTask(Authorize));
一个完整的例子可以在这里找到:https : //docs.microsoft.com/en-us/aspnet/web-forms/overview/performance-and-caching/using-asynchronous-methods-in-aspnet-45
不要使用,async void Page_Load因为这会导致意外行为,只有在 Windows 窗体中这才会起作用,因为有一个 UI 线程。请参阅此博客文章以供参考:https : //www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx
该Authorize方法可以通过删除 Task.Run 来优化,因为您已经可以有一个异步方法。
private static async Task Authorize()
{
authenticationResult = null;
tokenCredentials = null;
var authenticationContext = new AuthenticationContext("https://login.windows.net/common/oauth2/authorize/");
authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, clientId, credential);
if (authenticationResult != null)
{
tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");
}
}
请注意方法中的“async”关键字,并且 Task.Run 已被删除。
- 1 回答
- 0 关注
- 202 浏览
添加回答
举报