是否可以停止使用异步并等待所需

时间:2018-05-02 08:07:47

标签: c# multithreading asynchronous

我正在使用正在使用异步功能的开发人员实现代码。

示例:

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}}然后我感到陷入了这个异步笼子。

是否有一个技巧或其他什么来正常调用异步函数,阻止线程通过所有父函数冒泡?

或者是找到没有异步函数的软件包的唯一解决方案吗?

1 个答案:

答案 0 :(得分:2)

简短的回答是 - 不,没有通用的方法可以从基于任务的异步函数中创建同步函数。

问题是你不知道它是如何在内部实施的。比如,异步函数是使用async实现的,并且它(部分地)在主线程的上下文中运行。然后,如果调用者代码试图通过阻塞调用阻止主线程,那么async函数也会被阻塞,这会导致死锁。

但是,在您的特定情况下,您可以尝试创建一个新任务,从该任务调用async函数并获取其结果。它很有可能会起作用,但不能保证(如上所述)。

代码如下所示:

using (var response = Task.Run(() => httpClient.PostAsync(url, body).Result).Result)
{
    ...
}