And*_*ott 27 asp.net async-await
我编写了一个自定义ASP.NET控件,我刚刚更新它以获得异步Load事件处理程序.现在我收到这个错误:
此时无法启动异步操作.异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动.如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async ="true"%>.
该页面已经有了<%@ Page Async="true" %>
标签.所以我认为控件不能有异步加载事件处理程序.
在哪里可以找到ASP.NET webforms生命周期中允许异步的事件的完整列表?
And*_*ott 28
ASP.NET团队的Damian Edwards给出了这个答案:
Web表单中的异步void事件处理程序仅在某些事件上受支持,如您所见,但实际上仅用于简单的任务.我们建议使用PageAsyncTask进行任何真正复杂的异步工作.
ASP.NET团队的Levi Broderick给出了这个答案:
Web应用程序中的异步事件本质上就是奇怪的怪物.Async void适用于火灾和忘记编程模型.这适用于Windows UI应用程序,因为应用程序一直存在,直到操作系统将其杀死,因此每当异步回调运行时,都保证它是可以与之交互的UI线程.在Web应用程序中,由于请求是按定义瞬态的,因此该模型会崩溃.如果异步回调恰好在请求完成后运行,则无法保证回调需要与之交互的数据结构仍处于良好状态.因此,为什么火灾和遗忘(以及异步无效)在Web应用程序中本身就是一个坏主意.
也就是说,我们做疯狂的体操试图制作非常简单的东西,如Page_Load工作,但支持这一点的代码非常复杂,并且没有经过基本场景之外的任何测试.因此,如果您需要可靠性,我会坚持使用RegisterAsyncTask.
所以我认为我的问题的答案是:"这是错误的问题."
正确的问题是"我的ASP.NET Web窗体应用程序中应该如何异步?" 答案是将此代码段插入到您的aspx代码隐藏文件中:
this.RegisterAsyncTask(new PageAsyncTask(async cancellationToken => {
var result = await SomeOperationAsync(cancellationToken);
// do something with result.
}));
Run Code Online (Sandbox Code Playgroud)
同样的技巧在ASP.NET自定义控件中有效,只需使用即可this.Page.RegisterAsyncTask
.
归档时间: |
|
查看次数: |
16831 次 |
最近记录: |