2012-11-23 3 views
0

Windows Forms에서 진행률 표시 줄을 사용하는 동안 몇 가지 문제가 발생했습니다. 버튼 클릭으로 실행되는 10 개의 부분으로 구성된 알고리즘이 있다고 가정 해보십시오. 각 부분이 끝나면 양식의 진행률 표시 줄을 10 % 더 업데이트하고 싶습니다. 그러나 코드가 실행 중일 때 Windows Form은 응답하거나 업데이트하지 않습니다.코드 실행 중 Windows Forms GUI 업데이트

코드가 실행되는 동안 양식의 올바른 진행 상황을 알고 싶습니다.

+2

먼저 BackgroundWorker 클래스를 살펴 보겠습니다. – vcsjones

+0

MSDN은 친구입니다. BackgroundWorker 클래스의 설명서는 시작하기에 좋은 곳입니다. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.100).aspx –

+0

스레드는 시작하기에도 좋습니다. – Rafael

답변

4

BackgroundWorker을 사용해야합니다. http://www.dotnetperls.com/progressbar

using System.ComponentModel; 
using System.Threading; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
    public Form1() 
    { 
    InitializeComponent(); 
    } 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     // Start the BackgroundWorker. 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 1; i <= 100; i++) 
     { 
     // Wait 100 milliseconds. 
     Thread.Sleep(100); 
     // Report progress. 
     backgroundWorker1.ReportProgress(i); 
     } 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     // Change the value of the ProgressBar to the BackgroundWorker progress. 
     progressBar1.Value = e.ProgressPercentage; 
     // Set the text. 
     this.Text = e.ProgressPercentage.ToString(); 
    } 
    } 
} 

또는 당신은 같은 것을 사용할 수 있습니다 :
좋은 예는 여기에서 찾을 수 있습니다 좀 더 표준화 된 가볍고, 견고하고 확장 참조 등의 작업에 TPL을 사용하는 것이 좋습니다

private void StartButtonClick(object sender, EventArgs e) 
{ 
    var t1 = new Thread(() => ProgressBar(value)); 
    t1.Start(); 
} 

private void ProgressBar(value1) 
{ 
    ProgressBar.BeginInvoke(new MethodInvoker(delegate 
    { 
     ProgresBar.Value++ 
    })); 
}