为了账号安全,请及时绑定邮箱和手机立即绑定

webforms中的异步任务

webforms中的异步任务

C#
犯罪嫌疑人X 2021-11-21 14:46:23
我在使用 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");        }    });}
查看完整描述

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 已被删除。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信