为什么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
}
}
答案 0 :(得分:1)
那不是因为调用。您的UI队列已满,可能是因为:
DoStuff()
<强>更新强>
根据删除的评论,在文本框中放入50K的文本是问题的根源。考虑使用智能文本框,按需加载数据。应该有一个准备就绪。