2013-12-24 1 views
0

버튼과 진행률 막대가있는 간단한 폼이 있습니다. 사용자가 버튼을 클릭하면 처리가 시작되고 코드가 실행되는 동안 진행률 막대가 움직입니다. 이 경우에는 for 루프 일뿐입니다. 그러나 문제는 진행 막대가 잠깐 동안 만 나타나고 사라지는 것입니다.코드 실행 중 진행 표시 줄 (선택 윤곽)이 사라짐

private void button1_Click(object sender, EventArgs e) 
{ 
    progressBar1.Style = ProgressBarStyle.Marquee; 
    progressBar1.MarqueeAnimationSpeed = 100; 

    for (int i = 0; i < 3; i++) { Thread.Sleep(1000); } // sleep 3 times for 1 second 

} 

코드가 계속 된 후 프레임이 다시 그려지기 때문에 이런 현상이 발생한다고 생각하십니까? 그래서 다른 스레드에서 for 루프를 실행하려고했지만 문제가되지 않았다.

루프가 실행되는 동안 어떻게 막대를 애니메이션으로 만들 수 있습니까?

감사

답변

3

당신은 단순히 루프의 각 반복에 Application.DoEvents()에 호출을 포함하여이 문제를 해결할 수 있습니다.

그러나 이것을 달성하는 최선의 방법은 아닙니다.

루프를 다른 스레드 (예 : BackgroundWorker)에서 처리하여 진행률 막대를 메인 스레드에 애니메이션으로 유지하는 것이 좋습니다.

여기에서 몇 가지 설명을 얻을 수 있습니다. Keeping your UI Responsive and the Dangers of Application.DoEvents

+0

나는 BackgroundWorker를 더욱 홍보합니다. 그게 가장 좋은 방법입니다. – gunr2171

+0

@ gunr2171 가장 좋은 방법은 'async' 키워드를 활용하는 것입니다. 하지만 네,'BackgroundWorker'는'DoEvents' 호출보다 훨씬 낫습니다. –

+0

@DanielMann, 내가 본 것처럼 DoEvent는 아무 것도하지 않습니다. 그리고 스레드 사이에 객체를 전달하기위한 프레임 워크가 이미 존재하기 때문에'BackgroundWorker'라고 말합니다. 가장 중요한 부분 인 진행 상황에 대한 상태 메시지를 보내는 것과 함께. – gunr2171