知识大全 ASP.NET使用多线程范例
Posted 知
篇首语:孙竹新添绿玉枝,稚禽学习绕檐飞。动中会取归根意,雨过白云横翠微。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET使用多线程范例相关的知识,希望对你有一定的参考价值。
ASP.NET使用多线程范例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Web开发中使用多线程可以增强用户体验 尤其是多用户 多任务 海量数据和资源紧张的情况下 下面这些代码范例都是入门级的 希望对对大家学习ASP Net多线程编程有所帮助
使用多线程是为了提高CPU的利用率 即在在相同的时间里面做更多的事情(但前提是系统资源没有完全耗尽) ASP NET中使用多线程可以加快页面在服务器端的生成速度 一般页面生成过程中花费时间最多的是数据库查询阶段 如果你的页面有 个查询 不使用多线程的话 这 个查询将是串行执行的——即依次执行每一个查询 如果使用多线程 将可以使这 个查询几乎同时执行 这显然会提高页面的生成速度
在网上搜索了些许帖子说在IIS进程中使用多线程是不稳定的 可我经过实践却发现ASP NET使用多线程也没出啥问题 不过在ASP NET中使用多线程得注意一些地方 不然确实是不稳定 甚至是行不通的 比如不能在多线程中使用HttpContext下的任何方法和属性 这就包括Cookie Session Response Request Application等等 当使用这些方法或者属性的时候 IIS进程将会直接崩溃 更要注意的是 由于多线程与页面的加载(Load)是异步执行的 必须让这些创建的线程在Load执行完之前同步 不然可能导致数据没有加载成功 可能会有人问HttpContext等都被限制了 页面中还能做什么呢?我们完全可以把创建的线程与页面主体隔开 把需要的数据先在页面主体中获取 然后直接传入到创建的线程中就可解决 话不多说 具体如何 请看下文
假设某个页面中有 个SQL查询 一个是根据Url传递来的参数P确定当前页的内容 另一个查询是显示所有分类 第一个查询语句需要用到Request QueryString获取P传递来的页码 第二个查询语句则可直接写SQL语句
假设第一个查询语句如 SELECT * FROM Archives WHERE Page=传递的页码
假设第二个查询语句如 SELECT * FROM Category
我们先创建一个类 用于接受参数P和数据绑定控件ID(此处使用Repeater控件绑定数据) 此类能够把SQL语句查询的结果绑定到数据控件(Repeater)中
public classBindData
private int currentPage = ;
private Repeater rpID;
public BindData(Repeater rpID)
this rpID = rpID;
public BindData(Repeater rpID int page)
this rpID = rpID;
this currentPage = page;
public void BindCategory()
string strSql= SELECT * FROM Category ;
this BindDataToRepeater(strSql this rpID);
public void BindArchive()
string strSql = string Format( SELECT * FROM Archives WHERE Page= this currentPage);
this BindDataToRepeater(strSql this rpID);
private void BindDataToRepeater(string strSql Repeater rp)
if (rp == null) return;
SqlConnection conn = new SqlConnection( data source=数据服务器地址;User ID=用户名;pwd=密码;Initial Catalog=数据库名 );
SqlCommand cmd = new SqlCommand(strSql conn);
SqlDataReader dtr;
try
conn Open();
dtr = cmd ExecuteReader();
controlID DataSource = rp;
controlID DataBind();
if (!dtr IsClosed)
dtr Close();
catch
finally
cmd Dispose();
if (conn State = ConnectionState Open)
conn Close();
上面创建的BindData类中有 个构造函数 分别用于绑定分类 绑定Arhive的不同形式 如果使用其他数据绑定控件则可进行相应修改
创建了 个私有方法BindDataToRepeater用于把对应的SQL语句查询的结果绑定到对应的Repeater控件上 同时在此方法中使用了SqlDataReader 以提高绑定数据的速度 如果你使用了数据工厂可修改BindDataToRepeater中的具体实现过程
个共有方法BindCategory和BindArchive分别用于创建不同SQL语句 设置Repater的ID
同时需要引入System Web UI System Web UI HtmlControls System Data SqlClient 个必要的命名空间
值得注意的是在BindDataToRepeater方法中使用了try catch语句 但并没有在catch块中做任何事情 为什么我们用try catch却不在catch块中做点什么事情呢 不是多此一举吗?使用try catch是为了防止在执行BindDataToRepeater时抛出异常 若此处出现异常且此方法是在多线程中执行的 将会导致IIS进程崩溃 进而影响其他页面的正常执行 故而用try catch防止BindDataToRepeater抛出错误
我们之所以为数据绑定创建一个类 是为了提高内存利用率 当数据加载(Load)完毕的时候 为这个类创建的实例就会销毁 我们也可以通过在页面中创建几个全局变量来实现 但我还是建议以类的形式传递数据而不是使用全局变量 下面 我们开始在页面的Load中创建线程了 首先你需要在页面中引入System Threading命名空间
public classBindData
private int currentPage = ;
private Repeater rpID;
public BindData(Repeater rpID)
this rpID = rpID;
public BindData(Repeater rpID int page)
this rpID = rpID;
this currentPage = page;
public void BindCategory()
string strSql= SELECT * FROM Category ;
this BindDataToRepeater(strSql this rpID);
public void BindArchive()
string strSql = string Format( SELECT * FROM Archives WHERE Page= this currentPage);
this BindDataToRepeater(strSql this rpID);
private void BindDataToRepeater(string strSql Repeater rp)
if (rp == null) return;
SqlConnection conn = new SqlConnection( data source=数据服务器地址;User ID=用户名;pwd=密码;Initial Catalog=数据库名 );
SqlCommand cmd = new SqlCommand(strSql conn);
SqlDataReader dtr;
try
conn Open();
dtr = cmd ExecuteReader();
controlID DataSource = rp;
controlID DataBind();
if (!dtr IsClosed)
dtr Close();
catch
finally
cmd Dispose();
if (conn State = ConnectionState Open)
conn Close();
上面的代码显示在!IsPostBack状态下绑定数据 利用Request QueryString获取了当前页码 并创建了BindData的 个实例LoadArchives LoadCategory 通过 Thread thArhives=new Thread(new ThreadStart(LoadArchives BindArchive))为绑定Arhice创建线程 通过Thread thCategory = new Thread(new ThreadStart(LoadCategory BindCategory))为绑定分类创建线程 同时调用Thread的Start方法使 个线程进入执行状态 最后 在Load的最下面用Thread的Join方法使创建的 个线程与页面加载同步
值得注意的是 Join方法是必须的 如果不使用 可能导致创建的线程还未把数据完全绑定到Repeater上 Load就已经执行完毕 若如此页面上将没有任何数据 同时调用Start的代码行应尽量早 调用Join的代码行都应尽量迟——尽量放在Page_Load代码段的末尾 这样才能达到多线程的目的 若你每调用一个Start马上调用Join 其实质和没有使用多线程的效果是一样的 Join在MSND上的解释是 在继续执行标准的 和 SendMessage 消息泵处理期间 阻塞调用线程 直到某个线程终止为止
cha138/Article/program/net/201311/12820相关参考
ASP.NET多频道网站架构实现方法[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 经验分
ASP.NET多频道网站架构实现方法[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!主体架构
ASP.NET带进度条多文件上传 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! )解压jquer
Asp.net多频道网站开发架构浅析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们打开门户
这两天遇到一个需求就是在一个页面中浮动一张图片兼容浏览器那是默认需求鼠标悬停那也算是默认需求本来认为没什么麻烦的网上那么多随便搜一个再改吧改吧就哦了可是后来发现没有想象的那么简单 问题一网上DE
Java的多线程-实现多线程及线程的同步 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一.实现
Java多线程编程基础之线程和多线程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 随着计算机技
ASP.NET揭秘ASP.NET页面的结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!TheSt
ASP.NET底层架构探索之进入ASP.NET 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! A
超线程多核心下Java多线程编程分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一Java环