webforms中的异步任务

我在使用 powerbi api 调用授权任务时遇到了一些问题。它在 .It 处抛出AggregateException异常。Authorize().Wait();我也用谷歌搜索了它,但无法找到任何解决方案。任何帮助,将不胜感激。这是我的Page_Load函数代码


protected void Page_Load(object sender, EventArgs e)

{

        credential = new UserCredential(Username, Password);

        Authorize().Wait();

        using (var client = new PowerBIClient(new Uri(ApiUrl), tokenCredentials))

        {

            EmbedToken embedToken = client.Reports.GenerateTokenInGroup(<groupId>, <reportId>, new GenerateTokenRequest(accessLevel: "View", datasetId:<datasetId>));

            Report report = client.Reports.GetReportInGroup(<groupId>,<reportId> );

            System.Diagnostics.Debug.WriteLine("This is embed token");

            System.Diagnostics.Debug.WriteLine(embedToken);

            System.Diagnostics.Debug.WriteLine("this is embed url");

            System.Diagnostics.Debug.WriteLine(report.EmbedUrl);



        }


}

在这个函数中,我正在提取嵌入令牌和嵌入 url 并在输出窗口中打印出来,下面是授权函数代码


private static Task Authorize()

{

    return Task.Run(async () =>

    {

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

        }

    });

}


犯罪嫌疑人X
浏览 203回答 1
1回答

动漫人物

在里面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(){&nbsp; &nbsp; authenticationResult = null;&nbsp; &nbsp; tokenCredentials = null;&nbsp; &nbsp; var authenticationContext = new AuthenticationContext("https://login.windows.net/common/oauth2/authorize/");&nbsp; &nbsp; authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, clientId, credential);&nbsp; &nbsp; if (authenticationResult != null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");&nbsp; &nbsp; }}请注意方法中的“async”关键字,并且 Task.Run 已被删除。
打开App,查看更多内容
随时随地看视频慕课网APP