IIS挂起等待异步调用

时间:2018-03-23 20:28:21

标签: c# asp.net webforms async-await

我们有一个运行C#代码的IIS网站,它由IIS编译(这不是从* .cs文件运行的,它在aspx页面上带有<% %>标记的代码中。没有{{1}在页面代码中使用的指令。我们有一个.NET库,其中有一个暴露异步方法的类。当我们尝试同步调用异步方法时,如下所示:

async

页面挂起indefinitley。我们通过反复试验找到的解决方案是将异步调用包装在任务中:

var articles = _cmsClient.GetAllArticlesAsync().Result;

这是有效的,但我很想知道原因。

1 个答案:

答案 0 :(得分:2)

您不应该在代码渲染块(<% %>)内调用异步方法,因为无法以异步方式进行调用。换句话说,没有<async% %>或类似的任何语法。

相反,在Async="true"指令中设置@Page,将异步代码移至代码隐藏方法,并使用RegisterAsyncTask中的Page_Load进行注册。这些都是使用样本in the documentation here详细描述的。

您在代码隐藏中使用的方法应该是这样的:

public async Task<List<Article>> GetAllArticlesAsync()
{
    var articles = await _cmsClient.GetAllArticlesAsync();
    return articles;
}
  • 请勿使用.Result.Wait()。这些是阻塞的,非异步的方法。

  • 不要包装在Task.Run中 - 这只是将一个任务交换到另一个任务 - 这对于具有UI线程的桌面应用程序是有效的,但几乎没有理由进入Web应用程序。