2012-06-28 2 views
0

배경 작업자를 사용하여 별도의 스레드를 실행하고 있지만 RunWorkerAssync() 호출 후 내 프로그램이 중단 된 것처럼 보입니다.RunWorkerAssync에서 백그라운드 작업자 중지

BackgroundWorker worker = new BackgroundWorker(); 
    worker.WorkerSupportsCancellation = false; 
    worker.WorkerReportsProgress = true; 
    worker.DoWork += new DoWorkEventHandler(bw_DoWork); 
    worker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
    worker.RunWorkerAsync(); 
    console.writeline("I'm Done!"); 

그리고 여기 내 bw_DoWork 기능입니다 : 내가 모든 것을 설정하는 경우 여기에

입니다

private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 

     System.Threading.Thread.Sleep(5000); 

    } 

그리고 내 bw_RunWorkerCompletedbw_ProgressChanged :

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if ((e.Cancelled == true)) 
     { 

     } 

     else if (!(e.Error == null)) 
     { 

     } 

     else 
     { 

     } 
    } 

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

    } 

오전 데 문제 그게 충분히 틀림 없어, 나는 콘솔 출력을 5 초까지 얻지 못한다. 실행 후 onds. 절전 모드를 더 크게/더 짧은 시간으로 변경하면 콘솔 출력 대기가 적절하게 조정됩니다.

프로그램이 계속 실행되는 동안 다른 작업을 수행 할 수 있도록 백그라운드 작업자를 사용하는 것이 아닌가요? 또는 나는 무엇인가 놓치고 있냐?

감사합니다.

+1

나는 많은 양의 데이터를 검색하는 동안 얼어에서 응용 프로그램을 방지하기 위해 꽤 자주 배경 작업자 스레드를 사용하고 평범한 밖으로 보이는 당신이 게시 한 코드에 아무것도 없습니다. 여기에 포함 된 내용으로는 이것이 작동해서는 안되는 이유가 없습니다. 'bw_ProgressChanged' 및'bw_RunWorkerCompleted' 이벤트에는 무엇이 있습니까? 'console.writeline'이 작동하지 않기 때문에 이것은 실제 코드가 될 수 없습니다 ... 더 많은 작업 코드를 게시 할 수 있습니까? –

+0

나는 오늘의 나머지 시간 동안 사무실에서 떨어져있다. 내일 아침에 게시 하겠지만,'bw_ProgressChanged'와'bw_RunWorkerCompleted' 함수는 비어 있다고 확신합니다. – hemlocker

+0

이 코드는 컴파일 할 수 없으므로 실제 코드는보고 있지 않습니다. 아무도 가짜 코드로 문제를 재현하기를 기대하는 것은 무의미합니다. 아무도 할 수 없습니다. –

답변

1

아래의 간단한 응용 프로그램은 예상대로 작동합니다. 그것은 "나는 끝났어!"라고 씁니다. 즉시 5 초 후 "Completed"가 표시됩니다. 당신이 당신의 프로그램에서 할 수있는 특별한 것을 생각해 낼 수 있습니까?

using System; 
using System.ComponentModel; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BackgroundWorker worker = new BackgroundWorker(); 
      worker.WorkerSupportsCancellation = false; 
      worker.WorkerReportsProgress = true; 
      worker.DoWork += new DoWorkEventHandler(bw_DoWork); 
      worker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
      worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
      worker.RunWorkerAsync(); 
      Console.WriteLine("I'm Done!"); 
      Console.ReadKey(true); 
     } 

     private static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      Console.WriteLine("Completed"); 
     } 

     private static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     {    
     } 

     private static void bw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      System.Threading.Thread.Sleep(5000); 
     } 
    } 
} 
관련 문제