如何在文件后面的母版页代码中执行异步函数?

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

Jquery 不能在使用 ASP.NET C# 的母版页中工作,并且在不使用母版页的情况下工作正常

如何在两个部分中使用扩展相同的母版页布局?

GAE 项目的母版页 (python)

如何从母版页中的控件调用 javascript 函数?

使用具有选择性模拟的母版页