62,025
社区成员
发帖
与我相关
我的任务
分享
<div><p>累加开始于:<asp:TextBox ID="txtMinValue" runat="server"></asp:TextBox></p>
<p>累加结束于:<asp:TextBox ID="txtMaxValue" runat="server"></asp:TextBox></p>
<p>使用线程数:<asp:TextBox ID="txtThreadNumber" runat="server"></asp:TextBox><asp:Button ID="Button1" runat="server" Text="开始计算" OnClick="Button1_Click" /></p>
<p>累加结果:<asp:TextBox ID="txtOutput" runat="server"></asp:TextBox></p>
<p>信息:</p>
<asp:ListBox ID="lstMessage" runat="server" Height="244px" Width="353px"></asp:ListBox>
</div>
protected void Button1_Click(object sender, EventArgs e)
{
txtOutput.Text = "0";
lstMessage.Items.Clear();
int threadNumber = Convert.ToInt32(this.txtThreadNumber.Text);
for (int i = 1; i <= threadNumber; i++)
{
try
{
Thread thread = new Thread(new ThreadStart(Add));
thread.Name = i.ToString();
//thread.Priority = ThreadPriority.Normal;
thread.Start();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
}
}
}
private void Add()
{
DateTime beginTime = DateTime.Now;
long minValue = long.Parse(txtMinValue.Text);
long maxValue = long.Parse(txtMaxValue.Text);
int threadNumber = Convert.ToInt32(txtThreadNumber.Text);
int thradOrder = Convert.ToInt32(Thread.CurrentThread.Name);
long step = (maxValue - minValue + 1) / threadNumber;
long beginValue = minValue + step*(thradOrder-1);
long result = 0;
long endValue=beginValue+step;
for (long i = beginValue; i < endValue; i++)
{
result += i;
}
lock (this)//线程同步锁
{
long sum = long.Parse(txtOutput.Text);
sum += result;
txtOutput.Text = sum.ToString();
}
DateTime endTime = DateTime.Now;
TimeSpan timeSpan = endTime - beginTime;
string message = "线程" + Thread.CurrentThread.Name + ":" + beginValue.ToString() + "到" + endValue.ToString()
+ ",耗时:" + timeSpan.TotalMilliseconds.ToString() + "毫秒";
this.lstMessage.Items.Add(message);
Response.Write(message + "<br/>");
Thread.CurrentThread.Abort();
}
在 asp.net用一个线程来生成静态页面并不是什么难的事,但要实时调用正在生成数据的相关信息及进度就不是那么容易的事了,把线程定义成static,可以全局调用,并且只要不关闭iis进程,生成页面操作一样还在进行着,在客户端那怕是重启了电脑再来打开生成静态页面的页面,进度还在进行.
public static Thread myThread ;
cMyThread.myThread = new Thread(StartCreate.Intance.CreateHtmls);
cMyThread.myThread.Start();
StartCreate里保存了当前生成页面的相关信息,如StartCreate.title,StartCreate.singer,StartCreate.musicname
StartCreate 一样为静态的
这样让显示进度的页面实现接口
public partial class StartCreatPages : Page, ICallbackEventHandler
ClientScriptManager cs = Page.ClientScript;
if (Page.Request.Browser.SupportsXmlHttp)
{
string callbackScript = cs.GetCallbackEventReference(
this, //代表处理客户端回调的控件为当前页
"SendValue()", //是页面上的一个javascript函数,该函数返回的是用户在TextBox中输入的用户名,用户名将提交到服务器进行判断,GetClientUserName()函数的具体内容将在下面补上
"OnCallbackCompleted", //表示接收服务器端事件处理结果的javascript函数为 OnCallbackCompleted 函数
null, //这个实例不需要用到这个参数,所以给它一个空值。这个参数的具体作用见上面MSDN的解释
"OnServerError", //"OnServerError",这个参数指定了当服务器端处理出错时,由客户端的javascript函数OnServerError()来接收错误信息并处理。在这个实例中,当用户在TextBox里输入 "生铁猪" 的时候服务器端会抛出错误并调用客户端函数OnServerError()处理错误并显示
true //true 表示同步执行这次回调
);
//GetCallbackEventReference函数将根据参数返回一个string类型的发送回调请求的脚本,我们把这个脚本保存在callbackScript变量中
string callbackScriptMethod = "function CallbackScriptMethod() { " + callbackScript + " ;}";//这条语句将拼接一个名为CallbackScriptMethod的javascript脚本,然后把回调请求脚本放在这个函数体内。这样做以后就可以在javascript里通过CallbackScriptMethod() 函数引发回调
//以下这条语句把引发回调的函数CallbackScriptMethod()发送到客户端
cs.RegisterClientScriptBlock(this.GetType(), "CallbackScriptMethod", callbackScriptMethod, true);
}
else
{
cs.RegisterStartupScript(this.GetType(), "SupportsXmlHttp", "alert('你的浏览器不支持XmlHttp,不能使用回调功能!')", true);
}
public string GetCallbackResult()
{
return CallbackResult;
}
public void RaiseCallbackEvent(string eventArgument)
{
CallbackResult = //这里调用StartCreate里的相关内容,StartCreate.singer,StartCreate.musicname
//当然要返回当前数与最大数,这样才能在页面上实现进度
}
进度页面代码
<script type="text/javascript" language="javascript">
var percenttimer = 0;
var SPLITTER_RECORD = "{\r\r*\r\r}";
var aCurrentmusicinfo = null;
function WriteProcess(full, part)
{
var w = parseInt(part*500/full);
var strHtml = "<center style='font-size:12px;font-family:Arial;'><div style='width:500px; height:10px; border:1px #F7D4D4 solid;font-size:5px;' align='left'>";
strHtml +="<div style='width:"+ w +"px;height:10px;background:#4DADF4;'></div></div>"+parseInt(part*100/full) +"%</center>";
progress.innerHTML = strHtml;
}
function OnCallbackCompleted(CallbackResult,context)
{
aCurrentmusicinfo = CallbackResult.split(SPLITTER_RECORD);
WriteProcess(aCurrentmusicinfo[2],aCurrentmusicinfo[3]);
var strCurrentInfo = "正在生成:"+aCurrentmusicinfo[5]+"<br>生成情况:"+aCurrentmusicinfo[6]+"<br>歌曲名称:"+aCurrentmusicinfo[0]+"<br>歌手:"+aCurrentmusicinfo[1]+"<br>共有"+aCurrentmusicinfo[2]+"条记录,已经完成"+aCurrentmusicinfo[3]+"条<br>当前线程: "+aCurrentmusicinfo[4];
currentinfo.innerHTML = strCurrentInfo;
}
function OnServerError(error)
{
alert("错误信息 " + error);
}
function SendValue()
{
return 50;
}
percenttimer = setInterval("CallbackScriptMethod()",1000);
</script>
</head>
<body>
<form id="form1" runat="server">
<br />
<div style="text-align:center">
<asp:Button ID="btStart" runat="server" Text="开 始" Width="123px" OnClick="btStart_Click" />
<br /><br />
<asp:Button ID="btAbort" runat="server" OnClick="btAbort_Click" Text="中 断" />
<asp:Button ID="btClear" runat="server" Text="终 止"
onclick="btClear_Click" />
</div>
<br /><br />
<div id="progress">
</div>
<div id="currentinfo">
</div>
</form>