今天试着用.net2.0的客户端回调功能做了个后台进度显示,也可以改成进度条,进度值用session保存,主要处理过程使用线程,用FOR循环模拟,回调返回循环进度值。如图:
Default.aspx页如下:
<%...@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/javascript">...
//获取进度值前的操作,主要是初始化进度值为0,停止标志置0,并开启后台线程处理主函数
function startProgress()
...{
document.all.btnStart.disabled=true;
document.all.lblShow.innerHTML="准备...";
showState("正在处理...");
var arg="start";
<%= ClientScript.GetCallbackEventReference(this, "arg", "showState", null)%>; //不会执行showState();
getProgress(); //开始获取进度值
}
//开始获取进度值
function getProgress()
...{
var arg="get";
<%= ClientScript.GetCallbackEventReference(this, "arg", "showProgress", null)%>;
}
//显示进度值
function showProgress(result)
...{
document.all.lblShow.innerHTML=result;
if (result.substr(0,2)=="完成")
...{
showState("完成!");
document.all.btnStart.disabled=false;
return;
}
else if(result.substr(0,2)=="停止")
...{
document.all.btnStart.disabled=false;
alert("中断!"+result);
showState("中断!");
return;
}
else
...{
setTimeout("getProgress()",1000); //每秒获取一次当前进度
}
}
//停止后台线程,显示处理结果
function stoptGetProgress()
...{
if (document.all.btnStart.disabled==false) return;
var arg="stop";
<%= ClientScript.GetCallbackEventReference(this, "arg", "showState", null)%>;
}
//显示状态
function showState(result)
...{
document.all.lblState.innerHTML=result;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="btnStart" type="button" value="开始" onclick="startProgress();"/>
<input id="btnStop" type="button" value="stop" oncli ck="stoptGetProgress();"/>
当前进度:[<asp:Label ID="lblShow" runat="server" ForeColor="Red">0</asp:Label>]
共10
状态:[<asp:Label ID="lblState" runat="server" ForeColor="Red"></asp:Label>]
</div>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/javascript">...
//获取进度值前的操作,主要是初始化进度值为0,停止标志置0,并开启后台线程处理主函数
function startProgress()
...{
document.all.btnStart.disabled=true;
document.all.lblShow.innerHTML="准备...";
showState("正在处理...");
var arg="start";
<%= ClientScript.GetCallbackEventReference(this, "arg", "showState", null)%>; //不会执行showState();
getProgress(); //开始获取进度值
}
//开始获取进度值
function getProgress()
...{
var arg="get";
<%= ClientScript.GetCallbackEventReference(this, "arg", "showProgress", null)%>;
}
//显示进度值
function showProgress(result)
...{
document.all.lblShow.innerHTML=result;
if (result.substr(0,2)=="完成")
...{
showState("完成!");
document.all.btnStart.disabled=false;
return;
}
else if(result.substr(0,2)=="停止")
...{
document.all.btnStart.disabled=false;
alert("中断!"+result);
showState("中断!");
return;
}
else
...{
setTimeout("getProgress()",1000); //每秒获取一次当前进度
}
}
//停止后台线程,显示处理结果
function stoptGetProgress()
...{
if (document.all.btnStart.disabled==false) return;
var arg="stop";
<%= ClientScript.GetCallbackEventReference(this, "arg", "showState", null)%>;
}
//显示状态
function showState(result)
...{
document.all.lblState.innerHTML=result;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="btnStart" type="button" value="开始" onclick="startProgress();"/>
<input id="btnStop" type="button" value="stop" oncli ck="stoptGetProgress();"/>
当前进度:[<asp:Label ID="lblShow" runat="server" ForeColor="Red">0</asp:Label>]
共10
状态:[<asp:Label ID="lblState" runat="server" ForeColor="Red"></asp:Label>]
</div>
</form>
</body>
</html>
Default.aspx.cs代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
...{
protected void Page_Load(object sender, EventArgs e)
...{
if (!IsPostBack) //回调处理都引发Page_Load事件
...{
Session["progressValue"] = "0"; //初始化进度值为0
Session["stopFlag"] = "0"; //停止标志,1表示停止
}
}
客户端回调#region 客户端回调
private string returnValue; //返回值变量,回调的结果信息将保存在该字符串中
//引发回调事件处理
public void RaiseCallbackEvent(string eventArgument)
...{
//"eventArgument"为从客户端的JavaScript传递过来的参数
if (eventArgument == "start") //开始处理
...{
Session["progressValue"] = "0"; //初始化进度值为0
Session["stopFlag"] = "0"; //停止标志置0,(1表示停止)
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(startMain));
thread.Start(); //开启线程处理主要事情startMain()
return;
}
if (eventArgument == "stop") //停止线程
...{
Session["stopFlag"] = "1"; //停止标志置1,(1表示停止)
returnValue = "开始中断...";
return;
}
returnValue = Session["progressValue"].ToString(); //返回处理的值
}
//回传回调结果
public string GetCallbackResult()
...{
return returnValue;
}
#endregion
//主函数
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
...{
protected void Page_Load(object sender, EventArgs e)
...{
if (!IsPostBack) //回调处理都引发Page_Load事件
...{
Session["progressValue"] = "0"; //初始化进度值为0
Session["stopFlag"] = "0"; //停止标志,1表示停止
}
}
客户端回调#region 客户端回调
private string returnValue; //返回值变量,回调的结果信息将保存在该字符串中
//引发回调事件处理
public void RaiseCallbackEvent(string eventArgument)
...{
//"eventArgument"为从客户端的JavaScript传递过来的参数
if (eventArgument == "start") //开始处理
...{
Session["progressValue"] = "0"; //初始化进度值为0
Session["stopFlag"] = "0"; //停止标志置0,(1表示停止)
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(startMain));
thread.Start(); //开启线程处理主要事情startMain()
return;
}
if (eventArgument == "stop") //停止线程
...{
Session["stopFlag"] = "1"; //停止标志置1,(1表示停止)
returnValue = "开始中断...";
return;
}
returnValue = Session["progressValue"].ToString(); //返回处理的值
}
//回传回调结果
public string GetCallbackResult()
...{
return returnValue;
}
#endregion
//主函数