【问题标题】:Calling async method from Page_Load of webforms从 Web 表单的 Page_Load 调用异步方法
【发布时间】:2025-12-25 16:40:11
【问题描述】:

Here 是一个与我发现的问题相关的问题,但它不起作用。

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

void Page_Load(object sender, EventArgs e)

我想调用异步方法是因为我希望能够调用IdentityModelGetUserInfoAsync方法

这就是我所拥有的

    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 部分。

GetUserClaims(token).Wait(); 

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

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

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

但我得到了红色波浪状的东西,抱怨说

cannot convert from System.Threading.Task.Task to System.Func<System.Threading.Task.Task>

【问题讨论】:

  • 是一个与我发现的问题相关的问题,我发现它不起作用”为什么它不起作用
  • 我想我有详细的解释。我已经根据该问题中提到的答案解释了我尝试了什么,以及当我尝试这些选项时发生了什么

标签: c# asynchronous webforms async-await


【解决方案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();          
    }

【讨论】:

    【解决方案2】:

    如果您绝对不能按照链接问题的建议创建 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);
    

    【讨论】:

    • 试过了,仍然无法到达 GetUserClaims 方法的var result = response.Claims; 部分。不知道是不是IdentityModel的GetUserInfoAsync方法的问题