타이머를 만드는 BackgroundWorker
이 있습니다. 타이머는 DataTable
에 반복 호출합니다. 타이머가 멈 추면 BackgroundWorker.RunWorkerCompleted
이벤트 만 호출되기를 원합니다. 어떻게해야합니까?타이머가 멈 추면 BackgroundWorker RunWorkerCompleted 이벤트가 발생합니다.
감사합니다.
타이머를 만드는 BackgroundWorker
이 있습니다. 타이머는 DataTable
에 반복 호출합니다. 타이머가 멈 추면 BackgroundWorker.RunWorkerCompleted
이벤트 만 호출되기를 원합니다. 어떻게해야합니까?타이머가 멈 추면 BackgroundWorker RunWorkerCompleted 이벤트가 발생합니다.
감사합니다.
BackgroundWorker
의 DoWork
이벤트 처리기에서 루프를 만들고 타이머가 끝날 때까지 반복하십시오.
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 이벤트가 완료된 후
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();
}
}
은 어떻게 타이머를 비활성화 할 수 있습니다? – CodeZombie
@ZombieHunter 타이머는 'Elapsed' 이벤트 처리기 내에서 자체를 사용 중지 할 수 있습니다. 데이터베이스 호출에서 검색된 데이터 (또는 그 부족)를 기반으로합니다. 하지만 그것은 유효한 지적입니다. 물론 타이머는 외부에서 액세스해야하는 경우 다른 곳에서 선언해야합니다. 또한 람다가 항상 최선의 선택은 아닙니다. 내 코드는 아이디어의 그림을 그려주는 단순한 발췌 문장입니다. –