HttpClient.GetAsync立即抛出TaskCanceledException

时间:2016-05-31 13:31:25

标签: c# .net async-await httpclient

我有一个正在运行的代码,它从我的CommonRestClient返回一些东西(这是HttpClient的简单包装器):

public async Task<IActionResult> Index()
{
    var uri = _baseUri.Concat(AvalancheServiceAdresses.NodeService);
    using (var client = new CommonRestClient(uri))
    {
        var result = await client.GetAsync<List<NodeInfoContract>>(new Uri(NodeServiceConstant.NodesContractUrl, UriKind.Relative), null);
        return View(result);
    }
}

工作得很好,我很高兴。直到我决定从另一个类的视图中移动我的代码,这应该包含整个REST逻辑并提供OOP API。

所以现在我的索引看起来像:

public async Task<IActionResult> Index()
{
    var nodeInfoContracts = await _configManager.GetNodesList();
    return View(nodeInfoContracts);
}

其中GetNodesList

public ConfiguredTaskAwaitable<List<NodeInfoContract>> GetNodesList()
{
    var uri = _baseUri.Concat(AvalancheServiceAdresses.NodeService);
    using (var client = new CommonRestClient(uri))
    {
        return client.GetAsync<List<NodeInfoContract>>(new Uri(NodeServiceConstant.NodesContractUrl, UriKind.Relative), null);
    }
}

很明显,提供的代码是相同的。

但是现在它总是会在我尝试获得结果时抛出异常。在我的GetAsync方法中,它与TaskCanceledException后续行无效:

var response = await _client.GetAsync(url).ConfigureAwait(false);

但它的内容是:当我在这条线上放置一个断点并完成其工作时。所以这里我们有种族条件或类似情况。

为什么我得到它?我试图将CondigureAwait置为false / true,结合一些代码,但是当断点关闭时它总是会抛出错误。我检查了超时,这是几分钟,它不会导致此错误。

1 个答案:

答案 0 :(得分:3)

在第二个代码段中,客户端在IO完成之前处理。使用第一个表格。