前台用ajax不停进行查询,直到任务完成。进度条用的是jquery-ui。后台用一般处理程序处理相应,进度信息保存在HttpContext.Application中。
代码作为简单示例,实际应用时应对资源释放、防止多线程混乱等做进一步控制。
- 效果图:
- 代码:
前台:
1 2 3 4 56 7 8 9 43 44 45 46 47 48 49 5051 52
后台:
1 // 2015年12月16日 09:53:11 2 // David Huang 3 // 进度条示例 4 namespace ProgressTest 5 { 6 using System; 7 using System.Threading; 8 using System.Web; 9 10 ///11 /// Handler1 的摘要说明12 /// 13 public class Handler1 : IHttpHandler14 {15 // context16 private HttpContext context;17 18 public bool IsReusable19 {20 get21 {22 return false;23 }24 }25 26 public void ProcessRequest(HttpContext context)27 {28 this.context = context;29 if (context.Request["RequestType"] == "AjaxRequest")30 {31 if (context.Request["Method"] == "GetProgress")32 {33 context.Response.Clear();34 context.Response.Write(this.GetProgress());35 context.Response.End();36 }37 else38 {39 this.DoWork();40 }41 }42 }43 44 ///45 /// 开始工作46 /// 47 private void DoWork()48 {49 for (int i = 0; i < 100; i++)50 {51 // 记录进度52 // 实际应用中需要进一步控制(利用用户信息、cookies等),防止并发造成混乱53 this.context.Application["progress"] = i + 1;54 Random r = new Random();55 Thread.Sleep(r.Next(10, 100));56 }57 // 完成后释放资源58 this.context.Application["progress"] = null;59 }60 61 ///62 /// 查询进度63 /// 64 ///进度 65 private int GetProgress()66 {67 if (this.context.Application["progress"] != null)68 {69 return (int)this.context.Application["progress"];70 }71 else72 {73 return -1;74 }75 }76 }77 }