为什么我的`PageAsyncTask`在`Page_Load`中同步运行?

lzl*_*31x 4 c# asp.net asynchronous

我认为GetData注册的任务Page_Load不会阻止加载Index.aspx,因为它是一个异步任务; 渲染页面5秒后,lblData被设置并反映在页面上Index.aspx.

但是,在我的情况下,加载Index.aspx被阻止5秒,等待异步GetData完成.仅在5秒后Index.aspx渲染.

这是预期的吗?或者GetData是同步运行,因为我做错了什么?

// Index.aspx.cs
public partial class Index : Page
{
    protected string lblData;
    protected void Page_Load(object sender, EventArgs e)
    {
        RegisterAsyncTask(new PageAsyncTask(GetData));
        ExecuteRegisteredAsyncTasks();
    }

    public async Task GetData()
    {
        await Task.Delay(5000);
        lblData = "Hello world!";
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我加入Async="true"Index.aspx.

Lua*_*aan 5

"异步"是一个修饰语.你总是要问"与什么异步?"

在这种情况下,任务对于为请求提供服务的工作线程是异步的.重要的一点是,在处理大多数异步任务时,您不需要阻止请求线程,因此您的服务器将无法同时处理更多请求,同时可能使用更少的资源来执行此操作.

它与客户端上的页面呈现不同步,甚至不是单个请求本身 - 请求处理仍然是完全同步的,只有在整个响应准备就绪时才会发送(除非你使用显式Flushes,但这是另一个可以蠕虫).事实上,重点await是允许你的代码表现得像是同步的,而在线程,I/O,UI,你有什么异步.await是明确的同步点

实际上,这正是您首先使用异步基础架构的原因.如果您没有 使用异步任务RegisterAsyncTask,请求将在响应完成之前结束.基础结构允许您在不需要时释放工作线程,同时在异步工作返回时保持所有相关的请求上下文准备就绪.它类似于awaitMain控制台应用程序的方法中使用 - 如果基础设施没有准备好,await只是意味着return someTask;没有"并在完成任务时回到这里".

如果您想要一些不阻止请求处理的东西,它必须与请求异步.例如,页面可以向服务器发送单独的AJAX请求以提供更多数据.