Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪些ASP.NET生命周期事件可以是异步的?_Asp.net_Async Await - Fatal编程技术网

哪些ASP.NET生命周期事件可以是异步的?

哪些ASP.NET生命周期事件可以是异步的?,asp.net,async-await,Asp.net,Async Await,我已经编写了一个自定义ASP.NET控件,并且刚刚将其更新为具有异步加载事件处理程序。现在我得到了这个错误: 此时无法启动异步操作。异步操作只能在异步处理程序或模块内启动,或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保已标记该页面 页面已经有了标记。所以我认为控件不能有异步加载事件处理程序 在哪里可以找到ASP.NET webforms生命周期中允许异步的事件的综合列表?此页面解释了异步页面中的生命周期事件处理与ASP.NET 2.0中的同步页面中的事件处理有何不同(图

我已经编写了一个自定义ASP.NET控件,并且刚刚将其更新为具有异步加载事件处理程序。现在我得到了这个错误:

此时无法启动异步操作。异步操作只能在异步处理程序或模块内启动,或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保已标记该页面

页面已经有了
标记。所以我认为控件不能有异步加载事件处理程序


在哪里可以找到ASP.NET webforms生命周期中允许异步的事件的综合列表?

此页面解释了异步页面中的生命周期事件处理与ASP.NET 2.0中的同步页面中的事件处理有何不同(图2特别有用):

您还可能会发现这个使用问题(它讨论了相同的错误消息):


ASP.NET团队的Damian Edwards给出了以下答案:

web窗体中的异步void事件处理程序仅在某些 正如您所发现的,事件实际上只是为了简单化 任务。我们建议将PageAsyncTask用于任何实际的异步工作 复杂性

ASP.NET团队的Levi Broderick给出了以下答案:

web应用程序中的异步事件本质上是奇怪的。异步的 void是指一个fire-and-forget编程模型。这在中国很管用 Windows UI应用程序,因为应用程序会一直保留到 操作系统杀死了它,所以无论何时异步回调运行,都可以保证 成为可以与之交互的UI线程。在web应用程序中, 由于请求根据定义是暂时的,所以这个模型会崩溃。如果 异步回调恰好在请求完成后运行, 无法保证回调所需的数据结构 与客户的互动仍处于良好状态。那么,为什么要开火而忘记呢 (和async void)在web应用程序中本质上是一个坏主意

那 说,我们做疯狂体操是为了做一些非常简单的事情,比如 页面加载是可行的,但是支持这一点的代码非常复杂 除了基本场景之外,没有经过很好的测试。所以如果你 需要可靠性,我会坚持使用RegisterAsyncTask

所以我想我的问题的答案是:“这是个错误的问题。”

正确的问题是“我应该如何在ASP.NET Web窗体应用程序中保持异步?”答案是在aspx代码隐藏文件中插入以下代码段:

this.RegisterAsyncTask(new PageAsyncTask(async cancellationToken => {
    var result = await SomeOperationAsync(cancellationToken);
    // do something with result.
}));

同样的技巧也适用于ASP.NET自定义控件,只需使用
This.Page.RegisterAsyncTask

本文可能会帮助您:谢谢。这绝对是一本不错的书,虽然它没有回答我的问题。这也解释了一点,给出了比msdn更多的示例代码,但仍然没有回答你的问题:/你是如何将加载事件处理程序更新为异步的?你能提供事件处理程序的代码吗?私有异步无效页面加载(…)谢谢@Lokerim。特别是,有用的部分是
Page.RegisterAsyncTask
,它显然允许我的ASP.NET自定义控件执行任何类型的异步操作,即使ASP.NET不允许我在自定义控件中使用“async void Page\u Load”。谢谢