2011-09-18 4 views
0

이 프로그램은 스레드에서 1에서 5000까지의 숫자를 쓰고 있지만 메인 폼은 어쨌든 멈 춥니 다. 어디서 오류가 있습니까? 미리 감사드립니다.왜 양식이 고정 되나요?

코드 :

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using System.Threading; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     int how, current; 
     bool job; 
     Object lockobj = new Object(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Started!"); 
      how = 5000; 
      current = 0; 
      job = true; 
      Thread worker = new Thread(Go); 
      worker.Name = "1"; 
      worker.Start(); 
     } 

     private void Go() 
     { 
      while (job) 
      { 
       if (current < how) 
       { 

        lock (lockobj) 
        { 
         current++; 
        } 

        log(string.Format("Thread #{0}: {1}", Thread.CurrentThread.Name, current)); 
       } 
       else 
       { 
        job = false; 
       } 
      } 
     } 


     private void log(string text) 
     { 
      Action A = new Action(() => 
      { 
       richTextBox1.AppendText(text + System.Environment.NewLine); 
      }); 

      if (richTextBox1.InvokeRequired) 
       this.BeginInvoke(A); 
      else A(); 
     } 
    } 


} 

답변

3

대부분의 작업이

 if (richTextBox1.InvokeRequired) 
      this.BeginInvoke(A); 

에서 소비되고 양식을 호출하는 동안 잠겨 있기 때문에.

current++; 대신 Thread.Sleep(1000); :-)과 같은 실제 작업을 수행하면 양식이 업데이트 사이의 응답이됩니다.

3

당신은 매우 신속하게 텍스트 상자에 렌더링되고 GUI가 동기화해야 할 시간이 없기 때문에 그것은 정지. 이 렌더링은 주 GUI 스레드에서 발생하며 BeginInvoke을 호출하여 텍스트 상자를 업데이트하면이 주 GUI 스레드의 모든 리소스를 실제로 빠르게 소모한다는 점을 기억하십시오. 이 문제를 방지하려면 로깅을로 설정하는 빈도를 낮추십시오.

관련 문제