Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UI线程在textbox调用期间冻结_C#_Multithreading_User Interface_Backgroundworker_Freeze - Fatal编程技术网

C# UI线程在textbox调用期间冻结

C# UI线程在textbox调用期间冻结,c#,multithreading,user-interface,backgroundworker,freeze,C#,Multithreading,User Interface,Backgroundworker,Freeze,为什么UI在从分离线程调用textbox期间冻结 private void button1_Click(object sender, EventArgs e) { Thread t1 = new Thread(DoStuff); t1.Start(); } void DoStuff() { using (var wc = new System.Net.WebClient()) {

为什么UI在从分离线程调用textbox期间冻结

    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队列已满,这可能是因为:

  • 您经常调用
    DoStuff()
  • 您正在UI上做其他繁重的工作
  • 更新:


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

    如果在启动它之前执行
    t1.SetApartmentState(ApartmentState.STA)
    会发生什么?仍然一样。顺便说一句,UI冻结时间只有几百毫秒,实际上您不需要同步调用,对于UI,您可以自由地只调用BeginInvoke。此外,请尝试设置较小的文本。也许对于一个标准的文本框来说有点大是的,你是对的。我只是将文本长度减少到10k符号,UI不会冻结。谢谢