C# 等待asp.net中的GetByteArrayAsync不返回

C# 等待asp.net中的GetByteArrayAsync不返回,c#,asp.net,async-await,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.U

从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
}
专用异步任务UspsCreateAndPostRequest(字符串sUrl)
{
HttpClient=新的HttpClient();
字节[]urlContents=wait client.GetByteArrayAsync(sUrl);
string sResponse=System.Text.Encoding.UTF8.GetString(urlContents);
…//根据响应返回XPathNavigator对象的更多代码
}
如果我改为以下选项,效果很好:

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
}
专用异步任务UspsCreateAndPostRequest(字符串sUrl)
{
HttpClient=新的HttpClient();
字节[]urlContents=null;
var task=task.Run(async()=>{urlContents=await client.GetByteArrayAsync(strUrl);});
task.Wait();
string sResponse=System.Text.Encoding.UTF8.GetString(urlContents);
…//根据响应返回XPathNavigator对象的更多代码
}

方法签名返回是导致问题的任务这一事实吗?谢谢。

在调用堆栈的较高位置,有一个
.Wait()
正在对从
UspsCreateAndPostRequest
返回的任务执行

因为您将调用包装在
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
}
专用异步任务UspsCreateAndPostRequest(字符串sUrl)
{
HttpClient=新的HttpClient();
字节[]urlContents=await client.GetByteArrayAsync(sUrl).ConfigureAwait(false);
string sResponse=System.Text.Encoding.UTF8.GetString(urlContents);
…//根据响应返回XPathNavigator对象的更多代码
}

将以更少的资源实现相同的目标(但更好的做法是在链的更高层修复等待)。

在调用堆栈的更高层有一个
.wait()
正在对从
UspsCreateAndPostRequest
返回的任务执行

因为您将调用包装在
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
}
专用异步任务UspsCreateAndPostRequest(字符串sUrl)
{
HttpClient=新的HttpClient();
字节[]urlContents=await client.GetByteArrayAsync(sUrl).ConfigureAwait(false);
string sResponse=System.Text.Encoding.UTF8.GetString(urlContents);
…//根据响应返回XPathNavigator对象的更多代码
}

可以用更少的资源实现同样的目标(但更好的做法是修复链上更高的等待)。

不要调用
。等待()
在任务上,它会导致死锁。@ScottChamberlain OP说它是工作版本:)@Eser,因为链上的某个地方有一个
。等待()
在从
UspsCreateAndPostRequest
返回的任务上。因为他将它包装在一个
Task.Run
中,所以他丢失了执行上下文,这就是它工作的原因。执行
.ConfigureAwait(false)
将以更少的资源实现相同的目标(但更好的做法是修复链上更高的等待)。我找不到链上更高的任何其他.wait()。我取出一个Wait()并替换为.configurewait(false)调用,但仍然挂起。还尝试将.ConfigureAwait(false)添加到最初调用UspsCreateAndPostRequest的堆栈中较高的所有内容中,但仍然不起作用。但是有很多代码需要处理,我会继续检查。谢谢。不要在任务上调用
.Wait()
,这会导致死锁。@ScottChamberlain OP说这是工作版本:)@Eser,因为在链的更高层,从
UspsCreateAndPostRequest
返回的任务上有一个
.Wait()
。因为他将它包装在一个
Task.Run
中,所以他丢失了执行上下文,这就是它工作的原因。执行
.ConfigureAwait(false)
将以更少的资源实现相同的目标(但更好的做法是修复链上更高的等待)。我找不到链上更高的任何其他.wait()。我取出一个Wait()并替换为.configurewait(false)调用,但仍然挂起。还尝试将.ConfigureAwait(false)添加到最初调用UspsCreateAndPostRequest的堆栈中较高的所有内容中,但仍然不起作用。但是有很多代码需要处理,我会继续检查。谢谢。我刚刚尝试用“byte[]urlContents=await client.GetByteArrayAsync(sUrl).ConfigureAwait(false);”替换这3行,但仍然挂起并且没有返回。按照调用堆栈,每一级都需要
。ConfigureAwait(false)一直添加到它上面。有没有一篇帖子或文章更详细地解释了这一点?关于丢失执行上下文的部分…我刚刚尝试用“byte[]urlContents=await client.GetByteArrayAsync(sUrl).ConfigureAwait(false);”替换这3行,但仍然挂起并且不返回。按照调用堆栈,每一级都需要
。ConfigureAwait(false)一直添加到它上面。有没有一篇帖子或文章更详细地解释了这一点?关于丢失执行上下文的部分。。。