博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让WebForm异步起来
阅读量:5279 次
发布时间:2019-06-14

本文共 3031 字,大约阅读时间需要 10 分钟。

首先需要明白的是同步和异步的区别,撇开生硬的定义不谈,就以线程IO请求来说,同步就是让一个线程A去进行IO请求,当请求没有完成之前,线程A一直不离不弃的在那里死等,直到得到请求,可以想象,如果运用同步到请求队列中,这将是一个耗时费力的工作。但是如果采用异步请求的时候,当线程A去进行IO请求的时候,没有得到请求结果之前,线程A可以去做别的事情。这样,利用这种方式,可以提高服务器的吞吐量,MSDN中对此解释如下:

异步操作通常用于执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库。异步操作在主应用程序线程以外的线程中执行。应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。

那么在WebForm编程模型中,怎么实现异步呢?

首先来看看Asp.net生命周期和异步生命周期的对比(图片来源网络,如有侵权,请告知):

其实很简单,只要在页面首部写上Async="true" 的标记即可让这个页面异步起来。

至于在页面中实现异步,这里有两个方法:AddOnPreRenderCompleteAsyncRegisterAsyncTask

首先,对于AddOnPreRenderCompleteAsync方法,代码如下:

using System; using System.IO; namespace AsyncPagesApp {
public partial class _Default : System.Web.UI.Page {
FileStream fileStream; //文件流 protected void Page_Load(object sender, EventArgs e) {
if (IsPostBack) return; fileStream = new FileStream(@"\\***\20111122_EXO.txt",FileMode.Open); //文件流位置 AddOnPreRenderCompleteAsync(BeginAsyncOperation,EndAsyncOperation); //注册异步事件 } private IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state) //开始异步 {
int bufferSize = 99999999; byte[] buffer = new byte[bufferSize]; return fileStream.BeginRead(buffer,0,bufferSize,cb,state); } private void EndAsyncOperation(IAsyncResult ar) //异步结束 {
int fileReadByte = (int)fileStream.EndRead(ar); //得到异步执行结果 fileStream.Flush(); fileStream.Close(); //关闭流 Label1.Text = fileReadByte.ToString(); } } }

对于RegisterAsyncTask方法,代码如下:

using System; using System.Web.UI; using System.IO; namespace AsyncPagesApp {
public partial class RegisterAsyncTaskPage : System.Web.UI.Page {
FileStream fileStream; protected void Page_Load(object sender, EventArgs e) {
if (IsPostBack) return; //准备文件流读取 fileStream = new FileStream(@\\***\20111122_EXO.txt, FileMode.Open); //申明异步任务 PageAsyncTask task = new PageAsyncTask(BeginAsync,EndAsync,TimeoutAsync,true); //注册异步任务 RegisterAsyncTask(task); //开始运行 ExecuteRegisteredAsyncTasks(); } //开始运行 protected IAsyncResult BeginAsync(object sender, EventArgs e, AsyncCallback cb, object state) {
int bufferSize = 99999999; byte[] buffer = new byte[bufferSize]; return fileStream.BeginRead(buffer, 0, bufferSize, cb, state); } //运行结束 protected void EndAsync(IAsyncResult ar) {
int fileReadByte = (int)fileStream.EndRead(ar); //运行结束 fileStream.Flush(); fileStream.Close();//关闭 Label1.Text = fileReadByte.ToString(); } protected void TimeoutAsync(IAsyncResult ar) {
Label1.Text = "server Invalid! "; fileStream.Close(); } } }

从上面的代码,可以发现这两种异步方式的区别,第一种方式提供了一种比较简便的编程模型,只需要Begin***和End***方法即可,但是第一种方式不支持超时方式,并且,在第一种异步方式编程的内部,某些变量的值是不能获取的,比如说User.Identity.Name,但是在第二种异步方法中,是可以获取到的。同时需要说明的是在第二种异步方法中,最后一个参数如果设置为True的话,可以让多个任务并行运行。

转载于:https://www.cnblogs.com/scy251147/archive/2011/11/25/2263628.html

你可能感兴趣的文章
table中checkbox选择多行
查看>>
Magento开发文档(三):Magento控制器
查看>>
性能调优攻略
查看>>
ie6解决png图片透明问题
查看>>
瞬间的永恒
查看>>
2019-8-5 考试总结
查看>>
JS中实现字符串和数组的相互转化
查看>>
web service和ejb的区别
查看>>
Windows Azure Cloud Service (29) 在Windows Azure发送邮件(下)
查看>>
CS61A Efficiency 笔记
查看>>
微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
查看>>
div或者p标签单行和多行超出显示省略号
查看>>
Elasticsearch 滚动重启 必读
查看>>
Hadoop基本概念
查看>>
java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
查看>>
浅说 apache setenvif_module模块
查看>>
MySQL--数据插入
查看>>
重新学习python系列(二)? WTF?
查看>>
shell脚本统计文件中单词的个数
查看>>
SPCE061A学习笔记
查看>>