我有一个用于与日志API服务器通信的类库,方法“ chain”是这样的:
入口点->
private static bool SendChecksumToServer(Checksum checksum)
{
var res = _api.GetAsync($"Checksum?assemblyName={checksum.CurrentAssembly}&checkSum={checksum.LogFileChecksum}&fileName={checksum.FileName}");
return _api.Deserialize<bool>(res.Result.Content.ReadAsStringAsync().Result);
}
这叫什么:
public async Task<HttpResponseMessage> GetAsync(string apiCall)
{
ApiGet get = new ApiGet();
return await get.GetAsync(apiCall, client);
}
这叫什么:
public async Task<HttpResponseMessage> GetAsync(string apiCall, HttpClient client)
{
var response = await client.GetAsync(apiCall);
return response;
}
当我在控制台应用程序中使用类库时,此方法完全可以正常工作,但是一旦将其移至实际应用程序(MVC)后,它便停止工作,甚至根本无法执行控制器操作,尝试了所有我能想到的方法,例如检查防火墙,确保异步是正确的(尽管我确信这仍然不是因为api没有响应冻结了应用程序,但我无法再冒泡异步了)>
答案 0 :(得分:0)
很可能由于.Result
阻止呼叫而导致死锁。
不要混合使用阻止代码和异步代码
引用Async/Await - Best Practices in Asynchronous Programming
完全重构代码
private static async Task<bool> SendChecksumToServer(Checksum checksum) {
var res = await _api.GetAsync($"Checksum?assemblyName={checksum.CurrentAssembly}&checkSum={checksum.LogFileChecksum}&fileName={checksum.FileName}");
String data = await res.Result.Content.ReadAsStringAsync();
return _api.Deserialize<bool>(data);
}
确保正在调用的SendChecksumToServer
也正在等待任务,
,如果不需要等待,也不会在其他调用中使用async-await
。
public Task<HttpResponseMessage> GetAsync(string apiCall) {
ApiGet get = new ApiGet();
return get.GetAsync(apiCall, client);
}
ApiGet
public Task<HttpResponseMessage> GetAsync(string apiCall, HttpClient client) {
return client.GetAsync(apiCall);
}