5

为什么在从单独线程调用文本框期间 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
        }
    }
4

1 回答 1

1

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

  1. DoStuff()你经常打电话
  2. 你在 UI 上做其他繁重的工作

更新:

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

于 2013-04-07T11:56:21.273 回答