如何在文件后面的母版页代码中执行异步函数?
Posted
技术标签:
【中文标题】如何在文件后面的母版页代码中执行异步函数?【英文标题】:How can I execute an async function in Master Page code behind file? 【发布时间】:2021-10-14 20:49:18 【问题描述】:我有一个 ASP.Net Framework (4.7) 表单应用程序。
所有页面都使用母版页模板。在文件后面的母版页代码中,我正在调用一个需要一些时间的函数(异步)
Site.Master.cs
public void Page_Load(object sender, EventArgs e)
Page.RegisterAsyncTask(new PageAsyncTask(LoadUserFromActiveDirectoryAsync));
public async Task LoadUserFromActiveDirectoryAsync()
var currentUser = await << some async method in different library >>;
CurrentUser = currentUser;
当我运行这个时,我得到一个错误:
此操作要求页面是异步的(Async 属性必须设置为 true)。
我知道我应该在我的应用程序的每个 aspx 文件中设置Async="true"
。但是有没有办法我可以在母版页中设置这个选项?
Site.Master
<% Master
Language="C#"
AutoEventWireup="true"
CodeBehind="Site.master.cs"
Inherits="WebApp.SiteMaster"
Async="true" // this is not valid for Master Page
%>
【问题讨论】:
添加 await 无济于事!即使代码异步运行,你也有 await 理论上会等待!!!!因此,回发发生,页面到达服务器。您调用一些代码异步,然后等待等待,这将破坏整个目的!!!如果你等待,那么页面将在服务器上暂停,直到代码完成,所以你在这里获得零!!!只有当代码失败时,页面才会返回到客户端。因此,您可以启动另一个进程线程,但它与 UI 或该页面上的显示没有任何关系。在这里等待会破坏整个目标。 你要么等待,要么不等待?然后您可以将其他例程作为新任务/线程启动,但是如果该例程需要更改/更新/显示当前页面上的任何值,则无论如何您都必须等待!除非您的代码运行,否则网页不会返回给客户端。如果你进行异步调用,代码可以运行,但是一旦页面代码完成,它就会终止,并将页面发送到客户端。因此,如果该异步代码必须在当前页面上显示任何内容,则您必须等待,因此一无所获。请记住,一旦完成并将页面发送到客户端,页面类和代码就会超出范围 【参考方案1】:该示例使用新的 async 和 await 关键字(在 .NET 4.5 和 Visual Studio 2012 中可用)让编译器负责维护异步编程所需的复杂转换。编译器允许您使用 C# 的同步控制流构造编写代码,并且编译器会自动应用使用回调所需的转换以避免阻塞线程。 ASP.NET 异步页面必须包含将 Async 属性设置为“true”的 Page 指令。
主文件包含主指令。
Master Page 继承了 System.Web.UI 的 MasterPage 类,它不包含 AsyncMode 属性..所以你不能在 master page 上使用它。
普通页面继承System.Web.UI的Page类,其中包含AsyncMode。
信用:https://***.com/a/31001383/9787228
【讨论】:
除非您使用 await,否则您看不到客户端的更改。在回发时,页面会到达服务器。然后你调用一些异步例程,但无论如何你都必须等待!只有当你让所有代码都失败时,页面才会返回给客户端。您可以调用/启动另一个线程,让它继续运行并且页面代码下降,然后只有页面返回到客户端,然后显示。因此,异步代码不能修改网页或与网页有任何关系。要对网页进行更改,您必须在页面发送回客户端之前进行。以上是关于如何在文件后面的母版页代码中执行异步函数?的主要内容,如果未能解决你的问题,请参考以下文章
Usercontrol从内容页面的母版页访问Javascript