2013-04-07 9 views
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 
     } 
    } 
+0

Co się stanie, jeśli zrobisz "t1.SetApartmentState (ApartmentState.STA)" przed uruchomieniem? –

+0

Wciąż to samo. Btw UI zawiesza się tylko na kilkaset milisekund –

+1

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 –

Odpowiedz

1

to nie z powodu invoke. Kolejka UI jest pełny, a może to być spowodowane:

  1. Telefonujesz DoStuff() często
  2. Robicie inne ciężkie zadania na interfejsie

UPDATE:

Według skasowany komentarz, w którym źródłem problemu był 50K tekstu w polu tekstowym. Rozważ użycie inteligentnego pola tekstowego, które ładuje dane na żądanie. Tam powinien być jeden gotowy.

Powiązane problemy