gpt4 book ai didi

c# - GetStringAsync 方法调用挂起 UI 并且永远不会完成

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:21:49 27 4
gpt4 key购买 nike

我正在尝试使用 GetStringAsync 方法访问我的 url,但调用挂起并且永远不会结束。当我在浏览器中检查它时它工作完美但不知何故在我的代码中它永远不会结束。我的代码:

public bool Login(string url,string userName, string password)
{
try
{
Task<LoginResponse> response = GetLoginData(url, userName, password);
if(response.Result.UserInfo.UserId > 0){
IsAuthenticated = true;
}
return IsAuthenticated;
}
catch (ArgumentException argex)
{
ErrorMessage = argex.Message;
IsAuthenticated = false;
return IsAuthenticated;
}
}

public async Task<LoginResponse> GetLoginData(string url, string userName, string password)
{
try{
var param = new AuthenticationParam();
param.UserName = userName;
param.Password = password;

var response = await LoginValidate(url, param);

response = response.Replace("\"", string.Empty);
response = response.Replace("\\", "\"");

LoginResponse list = JsonConvert.DeserializeObject<LoginResponse>(
response, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

return list;
}
catch(Exception e){
System.Diagnostics.Debug.WriteLine(e);
return new LoginResponse();
}
}

private static async Task<string> LoginValidate(string url, AuthenticationParam param){
try
{
string result = "";
using (var client = new HttpClient())
{
var json_data = string.Empty;
json_data = JsonConvert.SerializeObject(param);
var byteArray = Encoding.UTF8.GetBytes(json_data);
var base64 = Convert.ToBase64String(byteArray);
url = $"{url}{base64}";
result = await client.GetStringAsync(url);
return result;
}
}
catch (Exception ex)
{
return "Error: " + ex.Message;
}
}

它卡在行 result = await client.GetStringAsync(url);

最佳答案

if(response.Result.UserInfo.UserId > 0){ -> .Result 是一个阻塞调用,可能会导致死锁。在调用链中一直使用 await。

public async Task<bool> Login(string url,string userName, string password)
{
try
{
var response = await GetLoginData(url, userName, password);
if(response.UserInfo.UserId > 0){
IsAuthenticated = true;
}
return IsAuthenticated;
}
catch (ArgumentException argex)
{
ErrorMessage = argex.Message;
IsAuthenticated = false;
return IsAuthenticated;
}
}

在调用堆栈中使用 var success = await Login(...);

请阅读 this关于如何创建此死锁的背景的优秀博文。

关于c# - GetStringAsync 方法调用挂起 UI 并且永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48301962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com