2010-06-10 6 views
1

Visual Studio 2010 및 C#을 사용 중이고 진행률 표시 줄을 표시하려고하지만 작동하지 않습니다.BackgroundWorker 및 Progressbar.Show()

나는 이벤트를 경청한다. 그것이 발생하면 나는 일을하고 진행하는 동안 진행 바를 보여주고 싶다.

static void Main(string[] args) { 
    ProgressForm form = new ProgressForm(); 
    new FileWatcher(form).Start(); 
    Application.Run(); 
} 

ProgressForm: 
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
private void bgWorker_DoWork(object sender, DoWorkEventArgs e) { 
    this.Show(); 
    .... 
} 

을하지만 아무것도 보여줍니다 :

이 내가 할 것입니다. 왜 그렇게 효과가 없습니까?

감사 안녕 위르겐

답변

1

BGW를 사용하여 양식을 표시 할 수 없으면 스레드의 상태가 올바르지 않습니다. SetApartmentState() 메서드를 호출하여 STA로 전환 할 수 있도록 스레드를 사용해야합니다. 스레드가 Application.Run()에 대한 호출이 필요한 상태를 유지하려면 메시지 루프가 필요합니다. 양식은 해당 스레드에서 만들어야합니다. 따라서이 양식

 var t = new Thread(() => Application.Run(new Form1())); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 

하나의 큰 문제는 그것이 당신의 UI 스레드에서 모든 창을 소유 할 수 없다는 것입니다. 다른 응용 프로그램의 창 뒤에 사라지는 경향이 있습니다. 또한 귀하의 UI 스레드는 여전히 죽어, 몇 초 후 캡션 표시 줄에 "응답 없음"메시지와 함께 유령 것입니다.

이렇게하는 올바른 방법은 다른 방법입니다. 시간이 많이 걸리는 코드를 다른 스레드에서 실행하면 BGW가 매우 좋은 선택이 될 것입니다. UI 스레드에 진행 상태 양식이 표시되어야합니다. BackgroundWorker.ReportProgress는 진행률 막대를 계속 업데이트하는 데 이상적입니다.

+0

도움 주셔서 감사합니다! 이제 작동합니다. 주요 문제는 내가 이렇게했다는 것입니다 : Application.Run(); 이 대신 을 입력하십시오. Application.Run (progressbarForm); 그리고 backgroundWorker에서 진행 막대를 불러 와서 보여줍니다! bye juergen – Juergen

1

당신은 당신은 UI 양식을 변경해서는 안 DoWork 이벤트 핸들러에서 ReportProgress 메서드를 호출하고 BackgroundWorker.ProgressChanged Event

+1

또한 "ReportsProgress"속성을 "true"로 설정해야한다고 생각합니다. –

+0

나는 progresschanged 이벤트도 시도했다. 아무 일도 발생하지 않습니다. 하지만 먼저 진행 상황을 보여주고 싶습니다. 그리고 나서 진행 상황을 설정하고 싶습니다. – Juergen

+0

ReportsProgress를 true로 설정하면 이벤트가 발생하지만 show는 아무 것도하지 않습니다. – Juergen

2

의 처리기에서 진행률을 표시하는 데 필요한 경우 BackgroundWorker에서 진행 상황을보고하기 위해 배경 스레드. 이 작업은 주 스레드에서만 수행해야합니다. 백그라운드 작업자를 시작하기 직전에 기본 진행 막대를 표시하고 백그라운드 작업자 RunWorkerCompleted 이벤트 처리기에서 숨길 수 있습니다. 실제 진행 상황을보고하려면 Giorgi가 제안한대로 구현이 필요합니다.

+0

이것은 정확히 내가하고 싶은 일입니다. 하지만 fileChangedEvent를 감시합니다. 이것은 주 스레드에서 발생하지 않습니다. – Juergen

+0

이 작업을 수행합니다. private void OnFileChanged (객체 소스, FileSystemEventArgs e) { // 여기에 내 진행 표시 줄을 표시하면 아무 일도 발생하지 않습니다. this.backgroundWorker.RunWorkerAsync(); } – Juergen

+0

"아무 일도 없다"는 것은 무엇을 의미합니까? 백그라운드 작업자를 시작하십시오. backgroundWorker.RunWorkerAsync(); 다음 줄에는 진행률 표시 줄이 표시됩니다. –