c# - UI 线程在文本框调用期间卡住

标签 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
        }
    }

最佳答案

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

  1. 您经常调用 DoStuff()
  2. 您正在 UI 上做其他繁重的工作

更新:

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

关于c# - UI 线程在文本框调用期间卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15862008/

相关文章:

c# - 在显示该项目上也定义的预设列表中的友好名称时绑定(bind)到值的正确方法是什么?

C# 正则表达式问题 "unrecognized escape sequence"

c# - Entity Framework 4.0 - 返回模型对象列表 + 每个对象的子对象数

java - 为什么 'extends Thread' 存在,而 'implements Runnable' 在所有情况下都是赢家

Java Swing : Animations made using Thread. sleep() 未按预期工作

iphone - 处理图像时的 iOS 设置进度条值

c - 构建 Win32 GUI 代码

c# - asp mvc razor 存储 lambda 表达式以列出并重用它

javascript - 如何在 View 中对 Controller 中的更改使用react

android - 蓝牙连接的线程在连接后立即关闭 socket