2012-01-30 2 views

답변

2

BackgroundWorkerDoWork 이벤트 처리기에서 루프를 만들고 타이머가 끝날 때까지 반복하십시오.

var worker = new BackgroundWorker(); 
worker.DoWork += (sender, e) => 
{ 
    var timer = new Timer(); 
    timer.Elapsed += (s, _e) => 
    { 
     // call the database 
    }; 

    timer.Start(); 

    while (timer.Enabled) 
    { 
     // at some point: timer.Stop(); 
    } 

    // if we are here, timer is no longer Enabled 
    // RunWorkerCompleted event will be fired next 
}; 

는 DoWork 이벤트가 완료된 후

+0

은 어떻게 타이머를 비활성화 할 수 있습니다? – CodeZombie

+0

@ZombieHunter 타이머는 'Elapsed' 이벤트 처리기 내에서 자체를 사용 중지 할 수 있습니다. 데이터베이스 호출에서 검색된 데이터 (또는 그 부족)를 기반으로합니다. 하지만 그것은 유효한 지적입니다. 물론 타이머는 외부에서 액세스해야하는 경우 다른 곳에서 선언해야합니다. 또한 람다가 항상 최선의 선택은 아닙니다. 내 코드는 아이디어의 그림을 그려주는 단순한 발췌 문장입니다. –

1

BackGroundWorker.RunWorkerCompleted가 호출 (물론 나는 타이머의 Interval 등이 설정 ommitted) : 더 또는 덜처럼. 따라서 DoWork 이벤트가 완료되면 RunWorkerCompleted 이벤트가 백그라운드 작업자에 의해 호출되어야합니다.

다른 해결책은 백그라운드 작업자 외부에서 타이머를 만들고 타이머에서 백그라운드 작업자 인스턴스를 제어하는 ​​것입니다. 타이머 이벤트에서 IsBusy 속성이 false로 설정되어 있는지 확인하고 백그라운드 작업자를 시작하거나 IsBusy가 true이면 건너 뜁니다.

샘플 :이 경우 내부에 정의되어 (그래서 당신은 외부에서 타이머에 대한 참조가없는) 경우

_worker.DoWork += (sender, e) => 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    // Do your database stuff 

    e.Result = databaseResult; 
} 

_timer.Elapsed += (source, e) => 
{ 
    if(!_worker.IsBusy) 
    { 
     _worker.RunWorkerAsync(); 
    } 
} 
관련 문제