我有一个正在运行的代码,它从我的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,结合一些代码,但是当断点关闭时它总是会抛出错误。我检查了超时,这是几分钟,它不会导致此错误。
答案 0 :(得分:3)
在第二个代码段中,客户端在IO完成之前处理。使用第一个表格。