从网页表单的Page_Load中调用异步方法

时间:2019-03-29 09:33:49

标签: c# asynchronous webforms async-await

Here是一个与我发现的问题有关的问题,该问题不起作用。

在Web表单的页面加载方法中,我想调用异步方法

void Page_Load(object sender, EventArgs e)

我想调用异步方法,因为我希望能够调用GetUserInfoAsync的{​​{1}}方法

这就是我所拥有的

IdentityModel

当前的问题是我从未达到 protected void Page_Load(object sender, EventArgs e) { var token = HttpContext.Current.Request.Headers.Get("Authorization"); GetUserClaims(token).Wait(); } public async Task GetUserClaims(string token) { var client = new HttpClient(); var response = await client.GetUserInfoAsync(new UserInfoRequest { Address = "https://localhost:44367/connect/userinfo", Token = token, }); var result = response.Claims; } 部分。

result = response.claims

基于我上面链接的问题的答案。

我尝试的另一个选项是使用答案中一个选项中提到的PageAsyncTask和RegisterAsyncTask。

GetUserClaims(token).Wait(); 

但是我收到红色的波浪状东西,抱怨说

    PageAsyncTask t = new PageAsyncTask(GetUserClaims(token));

2 个答案:

答案 0 :(得分:1)

如链接的问题所建议的那样,如果您绝对不能使Page_Load事件处理程序async void起作用,则正确的方法是:

GetUserClaims(token).ConfigureAwait(false).GetAwaiter().GetResult();

为避免在致电Wait()时发生deadlock

您还需要将.ConfigureAwait(false)添加到所有嵌套的异步调用中,以确保在相同的上下文中恢复执行:

UserInfoResponse response = await client.GetUserInfoAsync(new UserInfoRequest
{
    Address = "https://localhost:44367/connect/userinfo",
    Token = token,
}).ConfigureAwait(false);

答案 1 :(得分:1)

实际上这有所帮助

    protected void Page_Load(object sender, EventArgs e)
    {
        var token = HttpContext.Current.Request.Headers.Get("Authorization");
        PageAsyncTask t = new PageAsyncTask(() => GetUserClaims(token));
        // Register the asynchronous task.
        Page.RegisterAsyncTask(t);

        // Execute the register asynchronous task.
        Page.ExecuteRegisteredAsyncTasks();
        //GetUserClaims(token).ConfigureAwait(false).GetAwaiter().GetResult();          
    }