ASP.Net 4.6 任务等待不返回

时间:2021-03-25 17:35:43

标签: c# async-await task

我正在制作一个基本的 POST 以从 API 接收身份验证令牌。 我的代码通过按下按钮启动任务。

Task<DataClass.AuthenticationToken> token = GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

任务应该在“dataclass”中定义的数据结构中返回我的令牌信息

private async Task<DataClass.AuthenticationToken> GetAuthTokenAsync(string username, string password)
{
    string requestURL = DataClass.CloudAPIBaseURL + DataClass.CloudTokenURL;
    HttpClient client = new HttpClient();
    HttpResponseMessage response = new HttpResponseMessage();
    DataClass.AuthenticationRequest request = new DataClass.AuthenticationRequest
    {
        username = username,
        password = password
    };

    DataClass.AuthenticationToken token = new DataClass.AuthenticationToken();

    // Post request
    response = await client.PostAsJsonAsync(requestURL, request);

    //never gets here!!!
    // I will complete coding once I get the response.

    //string statusCode = response.StatusCode.ToString();
    return token;
}

使用 Fiddler,我看到我的 POST 发出并且响应包含正确的授权数据。 出于某种原因,异步等待没有返回。

3 个答案:

答案 0 :(得分:1)

问题可能是没有等待对 GetAuthTokenAsync 的调用:

Task<DataClass.AuthenticationToken> token = GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

试试这个:

DataClass.AuthenticationToken token = await GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

答案 1 :(得分:0)

您可以先尝试检查 client.PostAsJsonAsync(requestURL, request) 是否会返回同步调用的值,即无需等待调用:

response = client.PostAsJsonAsync(requestURL, request).Result;

如果它返回一个值,则问题可能出在调用 GetAuthTokenAsync 的周围代码中,即它不等待任务完成或类似问题。

答案 2 :(得分:0)

尝试最后一个建议: 在此处输入代码`DataClass.AuthenticationToken token = await GetAuthTokenAsync(tbUsername.Text.Trim(), tbPassword.Text.Trim());

编译器不允许将其作为对异步任务的调用。我用来调用任务的格式是正确的。继续试验了 5 天,我决定不使用 TASK await 方法。相反,我将任务更改为函数 GetAuthToken(parameters)。 使用 PostAsJsonAsync 而不使用 await 并添加 .Result,该方法等待结果。

HttpResponseMessage response = client.PostAsJsonAsync(requestURL, request).Result;
if (response.IsSuccessStatusCode)
        {
            // Ok 
            string data = response.Content.ReadAsStringAsync().Result;                
            thisToken = Newtonsoft.Json.JsonConvert.DeserializeObject<DataClass.AuthenticationToken>(data);
        }

我使用 Newtonsoft 反序列化数据,瞧。我可以继续我的项目!

请注意所有试图提供帮助的人。谢谢你。但是,如果您首先测试您的建议,因为有些建议不是有效的编码语法,这将很有帮助。

相关问题