当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

ASP.NET使用多线程范例

  Web开发中使用多线程可以增强用户体验,尤其是多用户、多任务、海量数据和资源紧张的情况下。下面这些代码范例都是入门级的,希望对对大家学习ASP.Net多线程编程有所帮助。

  使用多线程是为了提高CPU的利用率,即在在相同的时间里面做更多的事情(但前提是系统资源没有完全耗尽),ASP.NET中使用多线程可以加快页面在服务器端的生成速度。一般页面生成过程中花费时间最多的是数据库查询阶段,如果你的页面有10个查询,不使用多线程的话,这10个查询将是串行执行的——即依次执行每一个查询。如果使用多线程,将可以使这10个查询几乎同时执行。这显然会提高页面的生成速度。

  在网上搜索了些许帖子说在IIS进程中使用多线程是不稳定的,可我经过实践却发现ASP.NET使用多线程也没出啥问题。不过在ASP.NET中使用多线程得注意一些地方,不然确实是不稳定,甚至是行不通的。比如不能在多线程中使用HttpContext下的任何方法和属性,这就包括Cookie、Session、Response、Request、Application等等,当使用这些方法或者属性的时候,IIS进程将会直接崩溃。更要注意的是,由于多线程与页面的加载(Load)是异步执行的,必须让这些创建的线程在Load执行完之前同步,不然可能导致数据没有加载成功。 可能会有人问HttpContext等都被限制了,页面中还能做什么呢?我们完全可以把创建的线程与页面主体隔开,把需要的数据先在页面主体中获取,然后直接传入到创建的线程中就可解决。话不多说,具体如何,请看下文。

  假设某个页面中有2个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 = 1;

  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={0}",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();

  }

  }

  }

相关内容
赞助商链接