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 のテキストを入れることが問題の原因でした。オンデマンドでデータを読み込むスマート テキスト ボックスの使用を検討してください。そこに1つ用意されているはずです。

于 2013-04-07T11:56:21.273 に答える