C# 为什么我的“PageAsyncTask”注册在“Page_Load”中同步运行?
我认为C# 为什么我的“PageAsyncTask”注册在“Page_Load”中同步运行?,c#,asp.net,asynchronous,C#,Asp.net,Asynchronous,我认为Page\u Load中注册的GetData任务不会阻止Index.aspx的加载,因为它是一个异步任务;页面呈现5秒后,lblData被设置并反映在Index.aspx上 但是,在我的例子中,Index.aspx的加载被阻塞了5秒钟,等待异步GetData完成。只有在5秒钟后才会呈现Index.aspx 这是预期的吗?或者GetData正在同步运行,因为我做错了什么 // Index.aspx.cs public partial class Index : Page { prot
Page\u Load
中注册的GetData
任务不会阻止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!";
}
// ...
}
我已将Async=“true”
添加到Index.aspx
中,根据,您所做的一切都是正确的。我假设您错误地认为在GetData
函数中定义的异步操作完成之前,页面将被加载/呈现并返回到客户端——如果是这样的话,这是错误的
在所有工作完成之前,生命周期(异步)仍然不会返回到客户机。这里有一个可能更有意义的例子。Scott Hanselman给出了更好的解释。它可能是异步运行的,但它仍然是“代码隐藏”,在任何呈现的页面发送到浏览器之前,代码隐藏将在服务器上运行并完成 如果希望在页面加载到浏览器后动态填充网格,则需要使用JavaScript和WebMethods或WebAPI或类似的工具。异步”是一个修饰符。你总是要问“关于什么是异步的?” 在这种情况下,任务与为请求提供服务的工作线程是异步的。重要的一点是,在处理大多数类型的异步任务时,您不需要阻塞请求线程,因此您的服务器将能够在其他条件相同的情况下同时为更多的请求提供服务,同时可能使用更少的资源 对于客户端上的页面呈现,甚至对于单个请求本身,它都不是异步的——请求处理仍然是完全同步的,并且只有在整个响应就绪时才会发送(除非您使用显式
Flush
es,但这是另一整罐蠕虫)。事实上,await
的全部要点是允许您的代码像同步的一样运行,同时对于线程、I/O、UI等等都是异步的<代码>等待是显式同步点
事实上,这正是您首先使用异步基础设施的原因。如果使用不带注册表同步任务的异步任务,则请求将在响应完成之前结束。基础结构允许您在不需要工作线程时释放工作线程,同时在异步工作结束后仍保持所有相关请求上下文就绪。这类似于在控制台应用程序的Main
方法中使用await
——如果基础设施未就绪,await
仅表示返回某个任务代码>不带“任务完成后回到这里”
如果您想要不阻塞请求处理的东西,它必须与请求异步。例如,该页面可以向服务器发送单独的AJAX请求以提供更多数据。详细信息RegisterAyncTask可能有助于查看类似的声明“与RegisterAsyncTask连接的方法将在预渲染后立即运行。
比我的答案更好。错误的假设正是我所做的。谢谢你的回答和链接:)*仍然是“代码隐藏”…“谢谢你简洁的回答:)