热门搜索:   ASP.Net教程   前端开发   etl 工具   sql server 2008   .net 3.5   c#教程   SEO优化   visual studio 2010   ASP.Net 4.0教程   网站安全   ASP.Net MVC 入门视频教程   silverlight 教程   dhl   网站模板-dhl快递
ASP.Net教程
欢迎光临Elock Wong的博客。ASP.Net教程,为您开启WEB编程之门!从基础知识到实例教程,从PDF文档到视频教程,循序渐进地引导大家步入ASP.Net的殿堂。众多的面试题、源码资料、软件下载;近期还推出Ajax 、MVC 和CMS系统教程。相信教程的力量!

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

 

  一 ASP.Net利用多线程执行长时间的任务

  

这里以一个简单的范例作为我们ASP.Net教程多线程编程实战专题的开始。

 

在asp.net中执行一个长时间的操作,有的时候需要在在客户端有一个反馈能了解到任务的执行进度,大致看了一下有这么几种做法:
(1)按下按钮的时候给出一个<div>提示正在执行任务,执行完毕让这个<div>隐藏
(2)按下按钮的时候跳转到一个提示任务正在执行的页面,执行完毕了再跳转回来
(3)做一个任务类,开启另外一个线程执行任务,同时在客户端或者服务器端保存这个类的实例来跟踪任务的执行情况

(1)和(2)的情况用的比较多,也比较简单,缺点是不能实时的知道任务的执行进度,而且时间一长可能会超时,(3)的方法就会比较好的解决上面说的2个缺点。下面着重说一下(3)的实现方法,先从简单开始,我们做一个任务类,在客户端时时(暂且刷新时间为1秒)得知任务执行了多少时间,并且在成功完成任务后给出执行时间,在任务出错的时候给出出错的时间。

前台


<form id="Form1" method="post" runat="server">
<asp:label id="lab_state" runat="server"></asp:label><br>
<asp:Button id="btn_startwork" runat="server" Text="运行一个长时间的任务"></asp:Button>
</form>

后台

先是一些类的申明:
protected System.Web.UI.WebControls.Button btn_startwork;
protected System.Web.UI.WebControls.Label lab_state;
//前面2个是vs.net自己生成的
protected work w;

在Page_Load里面输入以下代码:

if(Session["work"]==null)
   {
    w=new work();
    Session["work"]=w;
   }
   else
   {
    w=(work)Session["work"];
   }
   switch(w.State)
   {
    case 0:
    {
     this.lab_state.Text="还没有开始任务";
     break;
    }
    case 1:
    {
     this.lab_state.Text="任务进行了"+((TimeSpan)(DateTime.Now-w.StartTime)).TotalSeconds+"秒";
     this.btn_startwork.Enabled=false;
     Page.RegisterStartupScript("","<script>window.setTimeout('location.href=location.href',1000);</script>");
     //不断的刷新本页面,随时更新任务的状态
     break;
    }
    case 2:
    {
     this.lab_state.Text="任务结束,并且成功执行所有操作,用时"+((TimeSpan)(w.FinishTime-w.StartTime)).TotalSeconds+"秒";
     this.btn_startwork.Enabled=true;
     break;
    }
    case 3:
    {
     this.lab_state.Text="任务结束,在"+((TimeSpan)(w.ErrorTime-w.StartTime)).TotalSeconds+"秒的时候发生错误导致任务失败";
     this.btn_startwork.Enabled=true;
     break;
    }
   }

在按钮单击事件内输入以下代码:

if(w.State!=1)
   {
    this.btn_startwork.Enabled=false;
    w.runwork();
    Page.RegisterStartupScript("","<script>location.href=location.href;</script>");
    //立即刷新页面
   }

另外建立一个任务类,代码如下:

public class work
 {
  public int State=0;//0-没有开始,1-正在运行,2-成功结束,3-失败结束
        public DateTime StartTime;
  public DateTime FinishTime;
  public DateTime ErrorTime;

  public void runwork()
  {
   lock(this)//确保临界区被一个Thread所占用
   {
    if(State!=1)
    {
     State=1;
     StartTime=DateTime.Now;
     System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(dowork));
     thread.Start();                        
    }
   }
  }

  private void dowork()
  {
   try
   {
    SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
    SqlCommand cmd=new SqlCommand("Insert Into test (test)values('test')",conn);
    conn.Open();
    for(int i=0;i<5000;i++)cmd.ExecuteNonQuery();
    conn.Close();
    //以上代码执行一个比较消耗时间的数据库操作
    State=2;
   }
   catch
   {
    ErrorTime=DateTime.Now;
    State=3;
   }
   finally
   {
    FinishTime=DateTime.Now;
   }
  }
 }
}

运行这个页面,看到每秒页面刷新一次反馈任务执行到现在的时间,在结束后给出任务总的用时。(如果任务出错也给出出错时间)

(这个示例比较简单,基本能实现长时间的任务执行与客户端的交互,但是界面不是很友善,而且如果有很多项操作的话,只能给出执行了多少时间,不能显示执行到第几项任务,在下一篇文章<ASP.Net教程系列:多线程编程实战(一) 续>http://www.cnblogs.com/elock/archive/2010/04/11/1709566.html中,将会改进这个类和界面)

 

posted on 2009-09-04 13:05  ASP.Net 4.0教程  阅读(1393)  评论(0编辑  收藏  举报

Loading
DHL新闻,将对中国至美国航线DHL,在春节期间DHL中文主页可以办理快递吗,DHL公益关注贫困地区青少年教育,问题DHL装备环保,发动机DHL在中国,内陆DHL网站图片举例,说明代理报关DHL等,知名快递DHL的客服,电话DHL门店
回到顶部