C# UI线程在textbox调用期间冻结
为什么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()) {
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()
根据删除的评论,将50K文本放入文本框是问题的根源。考虑使用一个按需加载数据的智能文本框。应该有一个已经准备好了。如果在启动它之前执行
t1.SetApartmentState(ApartmentState.STA)
会发生什么?仍然一样。顺便说一句,UI冻结时间只有几百毫秒,实际上您不需要同步调用,对于UI,您可以自由地只调用BeginInvoke。此外,请尝试设置较小的文本。也许对于一个标准的文本框来说有点大是的,你是对的。我只是将文本长度减少到10k符号,UI不会冻结。谢谢