我正在使用正在使用异步功能的开发人员实现代码。
示例:
public async Task<string> GetDataAsync(string jsonString = "")
{
string url = $"{this.url}";
using (HttpClient httpClient = new HttpClient())
{
using (StringContent body = new StringContent(jsonString, Encoding.UTF8, "application/json"))
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.accessToken);
using (HttpResponseMessage response = await httpClient.PostAsync(url, body))
{
switch (response.IsSuccessStatusCode)
{
case true:
return await response.Content.ReadAsStringAsync();
default:
throw new Exception($"Error calling url: {url}. HTTP status: {response.StatusCode}");
}
}
}
}
}
我不需要,也不需要,异步调用任何东西。但问题是异步函数在我的函数中一直冒泡,所以我不能停止使用它,因为HttpClient没有Post()
函数可以使用而不是{ {1}}然后我感到陷入了这个异步笼子。
是否有一个技巧或其他什么来正常调用异步函数,阻止线程通过所有父函数冒泡?
或者是找到没有异步函数的软件包的唯一解决方案吗?
答案 0 :(得分:2)
简短的回答是 - 不,没有通用的方法可以从基于任务的异步函数中创建同步函数。
问题是你不知道它是如何在内部实施的。比如,异步函数是使用async
实现的,并且它(部分地)在主线程的上下文中运行。然后,如果调用者代码试图通过阻塞调用阻止主线程,那么async
函数也会被阻塞,这会导致死锁。
但是,在您的特定情况下,您可以尝试创建一个新任务,从该任务调用async
函数并获取其结果。它很有可能会起作用,但不能保证(如上所述)。
代码如下所示:
using (var response = Task.Run(() => httpClient.PostAsync(url, body).Result).Result)
{
...
}