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> 吗?谢谢你。
在调用堆栈更高的某个地方,.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)
将用更少的资源实现相同的目标(但最好在链上修复更高的等待)。