相关疑难解决方法(0)

使用await/async时,HttpClient.GetAsync(...)永远不会返回

编辑: 这个问题看起来可能是同一个问题,但没有回复......

编辑:在测试用例5中,任务似乎陷入WaitingForActivation状态.

我在.NET 4.5中使用System.Net.Http.HttpClient遇到了一些奇怪的行为 - 其中"等待"调用(例如)的结果httpClient.GetAsync(...)将永远不会返回.

只有在使用新的async/await语言功能和Tasks API时才会出现这种情况 - 在仅使用continuation时,代码似乎始终有效.

下面是一些重现问题的代码 - 将其放入Visual Studio 11中新的"MVC 4 WebApi项目"中,以显示以下GET端点:

/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Run Code Online (Sandbox Code Playgroud)

这里的每个端点都返回相同的数据(来自stackoverflow.com的响应头),除非/api/test5从未完成.

我在HttpClient类中遇到过错误,还是以某种方式滥用了API?

代码重现:

public class BaseApiController : ApiController
{
    /// <summary>
    /// Retrieves data using continuations
    /// </summary>
    protected Task<string> Continuations_GetSomeDataAsync()
    {
        var httpClient = new HttpClient();

        var t = httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);

        return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString());
    }

    /// <summary>
    /// Retrieves data using async/await
    /// …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous async-await dotnet-httpclient

297
推荐指数
3
解决办法
17万
查看次数

死锁使用异步和等待

我想在我的程序中实现的是以下callstack/workflow:

  1. 调度()
  2. 授权()
  3. httpPost()

我的想法是,这dispatch()将是异步的,而其他两种方法仍然是非同步的.但是,出于某种原因,除非我做了2 + 3,否则它对我不起作用.异步.也许我还有一些误解.

根据我的理解,我可以a)authorize()在调用异步方法时使用-keyword(这将挂起方法并在异步方法完成后继续),或者b)省略httpPost()-keyword而是调用异步方法的Task.Result返回值,将阻塞直到结果可用.


让我告诉你工作的例子:

private int dispatch(string options)
{
    int res = authorize(options).Result;
    return res;
}

static async private Task<int> authorize(string options)
{
    string values = getValuesFromOptions(options);
    KeyValuePair<int, string> response = await httpPost(url, values);
    return 0;
}

public static async Task<KeyValuePair<int, string>> httpPost(string url, List<KeyValuePair<string, string>> parameters)
{
    var httpClient = new HttpClient(new HttpClientHandler());
    HttpResponseMessage response = await httpClient.PostAsync(url, new FormUrlEncodedContent(parameters));
    int code = (int)response.StatusCode;
    response.EnsureSuccessStatusCode();

    string responseString = …
Run Code Online (Sandbox Code Playgroud)

.net c# http async-await

4
推荐指数
1
解决办法
1295
查看次数

标签 统计

.net ×2

async-await ×2

c# ×2

asynchronous ×1

dotnet-httpclient ×1

http ×1