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
.
"异步"是一个修饰语.你总是要问"与什么异步?"
在这种情况下,任务对于为请求提供服务的工作线程是异步的.重要的一点是,在处理大多数异步任务时,您不需要阻止请求线程,因此您的服务器将无法同时处理更多请求,同时可能使用更少的资源来执行此操作.
它与客户端上的页面呈现不同步,甚至不是单个请求本身 - 请求处理仍然是完全同步的,只有在整个响应准备就绪时才会发送(除非你使用显式Flush
es,但这是另一个可以蠕虫).事实上,重点await
是允许你的代码表现得像是同步的,而在线程,I/O,UI,你有什么异步.await
是明确的同步点
实际上,这正是您首先使用异步基础架构的原因.如果您没有 使用异步任务RegisterAsyncTask
,请求将在响应完成之前结束.基础结构允许您在不需要时释放工作线程,同时在异步工作返回时保持所有相关的请求上下文准备就绪.它类似于await
在Main
控制台应用程序的方法中使用 - 如果基础设施没有准备好,await
只是意味着return someTask;
没有"并在完成任务时回到这里".
如果您想要一些不阻止请求处理的东西,它必须与请求异步.例如,页面可以向服务器发送单独的AJAX请求以提供更多数据.
归档时间: |
|
查看次数: |
561 次 |
最近记录: |