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

本文关键字:冻结 调用 线程 文本 UI | 更新日期: 2023-09-27 18:08:06

为什么在从分离线程调用文本框时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
        }
    }

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

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

  1. 您频繁呼叫DoStuff()
  2. 你正在UI上做其他繁重的工作

更新:

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