【发布时间】:2018-05-02 08:07:46
【问题描述】:
我正在实现来自使用异步函数的开发人员的代码。
例子:
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() 函数而不是 PostAnync() ,所以我觉得卡住了在这个异步笼子里。
有什么技巧可以正常调用异步函数,阻止线程在所有父函数中冒泡吗?
或者是找到没有异步功能的包的唯一解决方案?
【问题讨论】:
-
Task.Run(GetDataAsync).Result可能是您正在寻找的。它一直等到异步调用完成。 -
那么你不是阻塞了异步代码,这可能会导致你陷入僵局吗?
-
这里真正的问题是:为什么你觉得你不需要/或不想使用 async ?当您想要创建可扩展的应用程序时,您需要这样做
-
this is a webapplication只是让异步传播,并与 2018 年同步,尽可能使用 ConfigureAwait(false) -
首先异步并不意味着并行。异步执行将有价值的线程池线程从外部资源阻塞中解放出来,没有复杂性或性能成本。这意味着同一台 IIS 机器可以处理更多并发请求,即它通常更具可扩展性
标签: c# multithreading asynchronous