gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:19:20 26 4
gpt4 key购买 nike

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

An asynchronous operation cannot be started at this time. Asynchronous operations may only be started within an asynchronous handler or module or during certain events in the Page lifecycle. If this exception occurred while executing a Page, ensure that the Page is marked <%@ Page Async="true" %>.

页面确实<%@ Page Async="true" %>已经标记了。所以我认为控件不能有异步加载事件处理程序。

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

最佳答案

ASP.NET 团队的 Damian Edwards 给出了这样的答案:

Async void event handlers in web forms are only supported on certainevents, as you've found, but are really only intended for simplistictasks. We recommend using PageAsyncTask for any async work of any realcomplexity.

来自 ASP.NET 团队的 Levi Broderick 给出了这样的答案:

Async events in web applications are inherently strange beasts. Asyncvoid is meant for a fire and forget programming model. This works inWindows UI applications since the application sticks around until theOS kills it, so whenever the async callback runs there is guaranteedto be a UI thread that it can interact with. In web applications,this model falls apart since requests are by definition transient. Ifthe async callback happens to run after the request has finished,there is no guarantee that the data structures the callback needs tointeract with are still in a good state. Thus why fire and forget(and async void) is inherently a bad idea in web applications.

Thatsaid, we do crazy gymnastics to try to make very simple things likePage_Load work, but the code to support this is extremely complicatedand not well-tested for anything beyond basic scenarios. So if youneed reliability I’d stick with 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 即可。

关于asp.net - 哪些 ASP.NET 生命周期事件可以是异步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com