我们有一个运行C#代码的IIS网站,它由IIS编译(这不是从* .cs文件运行的,它在aspx页面上带有<% %>
标记的代码中。没有{{1}在页面代码中使用的指令。我们有一个.NET库,其中有一个暴露异步方法的类。当我们尝试同步调用异步方法时,如下所示:
async
页面挂起indefinitley。我们通过反复试验找到的解决方案是将异步调用包装在任务中:
var articles = _cmsClient.GetAllArticlesAsync().Result;
这是有效的,但我很想知道原因。
答案 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应用程序。