问题情况:
在子线程执行清算过程之前,对lbLog的操作都正常,但后面的操作无效,跟踪调试却没有问题。求教高手,为什么会出现这样的问题,有没有解决?代码如下,页面上就是一个文本框加上一个按钮。protected void btnOK_Click(object sender, EventArgs e)
{
this.btnOK.Enabled = false;
this.lbLog.Text = DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算开始。\r\n"); this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 正在取清算步骤... \r\n");
// 取清算步骤
Thread.sleep(1000); // 模拟长时间的数据库操作,如果没有这个,有时会正常。
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 取清算步骤完成。\r\n"); this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算线程启动,开始清算。\r\n");
lock (this)
{
Thread worker = new Thread(new ThreadStart(DoWork));
worker.Start();
}
}private void DoWork()
{
try
{
for (int i = 0; i < 5; i++)
{
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 正在运行清算步骤:") + i.ToString() + "... \r\n"; // 运行清算过程
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算步骤:") + i.ToString() + "成功完成。\r\n";
}
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算完成。\r\n");
}
catch (Exception ex)
{
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算过程失败:") + Utility.ErrorParse(ex) + "\r\n";
}
this.btnOK.Enabled = true;
}
在子线程执行清算过程之前,对lbLog的操作都正常,但后面的操作无效,跟踪调试却没有问题。求教高手,为什么会出现这样的问题,有没有解决?代码如下,页面上就是一个文本框加上一个按钮。protected void btnOK_Click(object sender, EventArgs e)
{
this.btnOK.Enabled = false;
this.lbLog.Text = DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算开始。\r\n"); this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 正在取清算步骤... \r\n");
// 取清算步骤
Thread.sleep(1000); // 模拟长时间的数据库操作,如果没有这个,有时会正常。
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 取清算步骤完成。\r\n"); this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算线程启动,开始清算。\r\n");
lock (this)
{
Thread worker = new Thread(new ThreadStart(DoWork));
worker.Start();
}
}private void DoWork()
{
try
{
for (int i = 0; i < 5; i++)
{
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 正在运行清算步骤:") + i.ToString() + "... \r\n"; // 运行清算过程
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算步骤:") + i.ToString() + "成功完成。\r\n";
}
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算完成。\r\n");
}
catch (Exception ex)
{
this.lbLog.Text += DateTime.Now.ToString("【yyyy-MM-dd hh:mm:ss】 清算过程失败:") + Utility.ErrorParse(ex) + "\r\n";
}
this.btnOK.Enabled = true;
}
btnOK_Click 启动线程之后,Response就返回客户端了,实际上客户端和服务端已经端开连接咯。
那个子线程操作的控件客户端再也看不见了。WebForm还真让不少同志把web开发当winform开发了建议你修改程序,把DoSomeWork放到另一个aspx或者ashx里。
btnOK_Click立即返回客户端,客户端通过iframe或者jQuery的ajax请求ashx。
再返回结果,用js刷客户端。