5
Tại sao UI đóng băng trong textbox gọi từ chủ đề táchthread UI đóng băng trong textbox gọi
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
}
}
Trong khi đó BackgroundWorker hoạt động hoàn hảo - UI không đóng băng
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
}
}
Điều gì sẽ xảy ra nếu bạn thực hiện 't1.SetApartmentState (ApartmentState.STA)' trước khi bắt đầu? –
Vẫn như cũ. Giao diện người dùng Btw chỉ đóng băng vài trăm mili giây –
Bạn thực sự không cần một Invoke đồng bộ, đối với UI bạn được tự do gọi BeginInvoke. Hơn nữa, hãy thử đặt văn bản nhỏ hơn. Có lẽ nó chỉ là một chút lớn cho một TextBox tiêu chuẩn –