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

Đ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? –

+0

Vẫn như cũ. Giao diện người dùng Btw chỉ đóng băng vài trăm mili giây –

+1

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 –

Trả lời

1

Đó không phải là vì invoke. hàng đợi giao diện người dùng của bạn là đầy đủ, và nó có thể là do:

  1. Bạn đang kêu gọi DoStuff() thường xuyên
  2. Bạn đang làm công việc nặng nhọc khác trên giao diện người dùng

Cập nhật:

Theo đã xóa nhận xét đưa 50K văn bản vào hộp văn bản là nguồn gốc của sự cố. Xem xét sử dụng một hộp văn bản thông minh tải dữ liệu theo yêu cầu. Nên có một sẵn sàng ra khỏi đó.

Các vấn đề liên quan