5
Dlaczego UI zawiesza się podczas tekstowym powołując oddzielony od gwintuUI wątek zawiesza podczas tekstowym powołuje
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
}
}
Tymczasem BackgroundWorker działa idealnie - UI nie zamarza
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
}
}
Co się stanie, jeśli zrobisz "t1.SetApartmentState (ApartmentState.STA)" przed uruchomieniem? –
Wciąż to samo. Btw UI zawiesza się tylko na kilkaset milisekund –
W rzeczywistości nie potrzebujesz synchronicznego Invoke, w interfejsie użytkownika możesz zadzwonić tylko do BeginInvoke. Ponadto spróbuj ustawić mniejszy tekst. Może to trochę za duże jak na standardowy TextBox –