2013-04-07 7 views
5

Warum UI während Textbox friert von getrennten Thread aufruftUI-Thread friert während Textbox Aufruf

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 
     } 
    } 

Inzwischen Background perfekt funktioniert - UI nicht

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

Was passiert, wenn Sie 't1.SetApartmentState (ApartmentState.STA)' vor dem Start ausführen? –

+0

Immer noch gleich. Btw UI friert nur für einige hundert Millisekunden ein –

+1

Sie brauchen eigentlich kein synchrones Invoke, für UI können Sie nur BeginInvoke aufrufen. Versuchen Sie außerdem, einen kleineren Text festzulegen. Vielleicht ist es nur ein bisschen groß für einen Standard TextBox –

Antwort

1

gefriert, das nicht wegen invoke ist. UI-Warteschlange voll ist, und es kann sein, weil:

  1. Sie rufen DoStuff() häufig
  2. Sie tun andere schwere Jobs auf UI

Update:

Nach Der gelöschte Kommentar, der 50K Text in die Textbox legte, war die Ursache des Problems. Erwägen Sie, ein intelligentes Textfeld zu verwenden, das Daten bei Bedarf lädt. Dort sollte einer bereit sein.

Verwandte Themen