在 asp.net 中等待 GetByteArrayAsync 不返回

Kev*_* M. 1 c# asp.net async-await

以下代码在从 ASP.NET 应用程序调用时挂起:

private async Task<XPathNavigator> UspsCreateAndPostRequest(string sUrl)
{
  HttpClient client = new HttpClient();
  byte[] urlContents = await client.GetByteArrayAsync(sUrl);
  string sResponse = System.Text.Encoding.UTF8.GetString(urlContents);
  ... //more code to return XPathNavigator object based on response
}
Run Code Online (Sandbox Code Playgroud)

如果我改为跟随它工作正常:

private async Task<XPathNavigator> UspsCreateAndPostRequest(string sUrl)
{
  HttpClient client = new HttpClient();
  byte[] urlContents = null;
  var task = Task.Run(async () => { urlContents = await client.GetByteArrayAsync(strUrl); });
  task.Wait();
  string sResponse = System.Text.Encoding.UTF8.GetString(urlContents);
  ... //more code to return XPathNavigator object based on response
}
Run Code Online (Sandbox Code Playgroud)

方法签名返回的事实是导致问题的 Task<XPathNavigator> 吗?谢谢你。

Sco*_*ain 5

在调用堆栈更高的某个地方,.Wait()正在执行从 返回的任务UspsCreateAndPostRequest

因为您将调用包装在 a 中,所以Task.Run您丢失了执行上下文,这就是它起作用的原因。正在做

private async Task<XPathNavigator> UspsCreateAndPostRequest(string sUrl)
{
  HttpClient client = new HttpClient();
  byte[] urlContents = await client.GetByteArrayAsync(sUrl).ConfigureAwait(false);
  string sResponse = System.Text.Encoding.UTF8.GetString(urlContents);
  ... //more code to return XPathNavigator object based on response
}
Run Code Online (Sandbox Code Playgroud)

将用更少的资源实现相同的目标(但最好在链上修复更高的等待)。