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队列已满,这可能是因为:
- 您频繁呼叫
DoStuff()
- 你正在UI上做其他繁重的工作
更新:
根据删除的评论,将50K的文本放入文本框是问题的根源。考虑使用一个智能文本框,它可以根据需要加载数据。应该有一个已经准备好了。