ASP.Net:在 Page_Load 中调用异步方法

Posted

技术标签:

【中文标题】ASP.Net:在 Page_Load 中调用异步方法【英文标题】:ASP.Net: Call an async method in Page_Load 【发布时间】:2018-04-30 16:16:22 【问题描述】:

我有这个 API 客户端,它有一个发送方法,用于将我的对象发布到 Web API 服务并返回 ReturnedResults 类型的对象。 现在我需要在 ASP.net page_load 事件中运行这个 post 方法。 我在这里看到了类似的例子,但是我需要的是从我的异步方法中获取我的返回对象。

我知道我应该使用

PageAsyncTask t = new PageAsyncTask(APIService.Send("test"));

但是我有两个问题,首先 PageAsyncTask 不接受我的 Send 方法作为有效的 Task 类型,我猜这是因为我的方法返回 Task 类型的 Task 所以它抱怨它不能将 Task 转换为 System.Func

还有,一旦我的 ReturnedResults 对象成功执行,我该如何从中取出它?

【问题讨论】:

***.com/questions/35899800/can-page-load-be-async 谢谢,但我看过那些文章,它们都对我的情况没有帮助,我需要从我的异步方法中获取结果,同时让它暂停页面加载,直到等待异步方法结束。 理想情况下,将重载方法放在 Page_Load 中并不是一个好主意。我不确定您的要求如何。但是,它可能需要修改您的系统设计。 复制者:***.com/questions/8242375/… 和 ***.com/questions/34204450/…。 Page_load a 自然是同步的。如果您想优化 IIS 吞吐量(如 MVC/Web API 中的异步控制器方法),Page.RegisterAsyncTask 没有意义。 Page.RegisterAsyncTask 更像是可管理的“即发即弃”。 【参考方案1】:

仅仅因为你不能等待PageAsyncTask 的结果并不意味着任务本身不能启动更多你可以等待的功能。您可以利用这一点来进行异步页面加载。

public void Page_Load(object sender, EventArgs e)

    RegisterAsyncTask(new PageAsyncTask(PageLoadAsync));

 
public async Task PageLoadAsync()

    //perform your actions here, including calling async methods and awaiting their results

    Task<string> downloadTask = new WebClient().DownloadStringTaskAsync("http://www.example.com");

    TextBox1.Title = "We can do some actions while waiting for the task to complete";

    TextBox2.Title = await downloadTask;

确保您的页面被标记为异步。

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="Default" Async="true" %>

请记住,上面的代码有点误导。 ASP.NET Web 窗体仍然基于 HTTP 请求/响应模型。在等待某些文件下载时,它实际上无法在客户端更新文本框的标题。相反,它会在 HTTP 响应中更新文本框的标题,一旦所有服务器端处理完成(包括您的异步任务),它就会将响应发送到客户端,此时他们将看到更新后的文本框的标题。

【讨论】:

谢谢,这似乎是一个很好的解决方案,但是如果我向我的方法添加参数,那么 PageAsyncTask 不接受它并给我“无法将任务转换为 System.Func”的错误。我需要参数,因为我必须在将内容发布到 API 之前对其进行处理。 @user65248 你没抓住重点。将参数直接放在调用异步方法的 PageLoadAsync 方法中。不需要实际将参数传递给 PageLoadAsync。 我确实设法通过制作一个像这样的新 Func(async () => await PageLoadAsync("Arguments") 的 lambda 函数来运行它。但是现在我认为它有点像 Fire and Forget我的任务,我需要它暂停 page_load 直到工作完成然后继续加载其他内容,这样我可以根据结果将内容保存到数据库中。也许我在这里走错了路。 @user65248 再一次,你错过了重点。将之前在 Page_Load 中的所有逻辑(除了我展示的异步任务注册)移到 PageLoadAsync 中。 我现在明白了,非常感谢,现在一切正常。

以上是关于ASP.Net:在 Page_Load 中调用异步方法的主要内容,如果未能解决你的问题,请参考以下文章

标准 asp.NET 中的 OnActionExecuting 等效项?

尝试在 page_load 上显示 2 个下拉列表中的 1 个将不起作用。 ASP.net

在Page_Load方法中获取真正的当前类名-ASP.NET Web应用程序(.NET Framework)

为啥 ASP.NET 动态控件即使添加到 Page_Load 中也能保持 ViewState?

asp.net C# 如何以编程方式更改 Page_Load 上的正文背景图像

asp.net中的页面卸载事件