簡體   English   中英

HttpClient凍結在GetStringAsync方法上

[英]HttpClient freezes on the GetStringAsync method

我有這個c#MVC代碼,它可以與GetAsync和GetPost方法一起正常工作,但是當使用GetStringAsync時,它會凍結在該行:

version = await client.GetStringAsync("/API/Version");

驅動程序代碼:

Task<string>[] tasks = new Task<string>[count];
for (int i = 0; i < count; i++)
{
    tasks[i] = MyHttpClient.GetVersion(port, method);
}
Task.WaitAll(tasks);
string[] results = new string[tasks.Length];
for(int i=0; i<tasks.Length; i++)
{
    Task<string> t = (Task<string>)(tasks[i]);
    results[i] = (string)t.Result;
}

HttpCilent代碼:

public static async Task<string> GetVersion(int port, string method)
{
    try
    {
        var client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:" + port);
        string version = null;
        if (method.ToUpper().Equals("GETSTR"))
        {
            version = await client.GetStringAsync("/API/Version");
        }
        else if (method.ToUpper().Equals("GET"))
        {
            HttpResponseMessage res = client.GetAsync("/API/Version").Result;
            version = res.Content.ReadAsStringAsync().Result;
        }
        else if (method.ToUpper().Equals("POST"))
        {
            var content = new FormUrlEncodedContent(new[] 
            {
                new KeyValuePair<string, string>("name", "jax")
            });
            HttpResponseMessage res = client.PostAsync("/API/Version", content).Result;
            version = res.Content.ReadAsStringAsync().Result;
        }
        client.Dispose();
        return version;
    }
    catch (Exception ex)
    {
        return "Error: " + ex.Message;
    }
}
}

有什么想法嗎?

通常,您不應該將async / await.Result.Wait() 首先修復GetVersion方法:

public static async Task<string> GetVersion(int port, string method)
{
    try
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:" + port);
            if (method.ToUpper().Equals("GETSTR"))
            {
                return await client.GetStringAsync("/API/Version")
                    .ConfigureAwait(false);
            }
            else if (method.ToUpper().Equals("GET"))
            {
                var res = await client.GetAsync("/API/Version").ConfigureAwait(false);
                return await res.Content.ReadAsStringAsync().ConfigureAwait(false);
            }
            else if (method.ToUpper().Equals("POST"))
            {
                var content = new FormUrlEncodedContent(new[] 
                {
                    new KeyValuePair<string, string>("name", "jax")
                });
                var res = await client.PostAsync("/API/Version", content)
                    .ConfigureAwait(false);
                return await res.Content.ReadAsStringAsync().ConfigureAwait(false);
            }
        }
    }
    catch (Exception ex)
    {
        return "Error: " + ex.Message;
    }
}

所有我在這里所做的是替換<task>.Result與調用await <task> 對於每個await ,將在await之后的方法部分注冊為正在等待的Task的延續(如果遇到每個await表達式時),而不是在.Result情況下阻塞線程。

現在,在調用代碼中,您需要做同樣的事情:

var tasks = new Task<string>[count];
for (int i = 0; i < count; i++)
{
    tasks[i] = MyHttpClient.GetVersion(port, method);
}
var results = new string[tasks.Length];
for (int i = 0; i < tasks.Length; i++)
{
    results[i] = await tasks[i];
}

或更簡單地說:

var tasks = new Task<string>[count];
for (int i = 0; i < count; i++)
{
    tasks[i] = MyHttpClient.GetVersion(port, method);
}
var results = await Task.WhenAll(tasks);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM