问题情况:
在子线程执行清算过程之前,对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;
}

解决方案 »

  1.   

    你这种多线程没有用的。
    btnOK_Click 启动线程之后,Response就返回客户端了,实际上客户端和服务端已经端开连接咯。
    那个子线程操作的控件客户端再也看不见了。WebForm还真让不少同志把web开发当winform开发了建议你修改程序,把DoSomeWork放到另一个aspx或者ashx里。
    btnOK_Click立即返回客户端,客户端通过iframe或者jQuery的ajax请求ashx。
    再返回结果,用js刷客户端。