UI线程在文本框调用期间冻结

时间:2013-04-07 11:48:41

标签: c# multithreading user-interface backgroundworker freeze

为什么UI在从分离的线程调用的文本框中冻结

    private void button1_Click(object sender, EventArgs e)
    {
        Thread t1 = new Thread(DoStuff);
        t1.Start();
    }

    void DoStuff()
    {
        using (var wc = new System.Net.WebClient())
        {
            string page_src = wc.DownloadString("http://bing.com");
            textBox1.Invoke((MethodInvoker)delegate() { textBox1.Text = page_src; }); // freezes while textbox text is changing
        }
    }

同时,backgroundworker工作得很好 - UI不会冻结

    private void button1_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw1 = new BackgroundWorker();
        bw1.DoWork += (a, b) => { DoStuff(); };
        bw1.RunWorkerAsync();
    }

    void DoStuff()
    {
        using (var wc = new System.Net.WebClient())
        {
            string res = wc.DownloadString("http://bing.com");
            textBox1.Invoke((MethodInvoker)delegate() { textBox1.Text = res; }); // works great
        }
    }

1 个答案:

答案 0 :(得分:1)

那不是因为调用。您的UI队列已满,可能是因为:

  1. 您经常致电DoStuff()
  2. 你在UI上正在做其他繁重的工作
  3. <强>更新

    根据删除的评论,在文本框中放入50K的文本是问题的根源。考虑使用智能文本框,按需加载数据。应该有一个准备就绪。