을 차단하는 방법 타이머를 처리하는 동안 경과된 이벤트?
-
03-07-2019 - |
문제
나는 타이머는 필요하지 않 프로세스 이 이벤트에 처리기 같은 시간입니다.그러나 처리를 한 경과 이벤트 도 을 방해 다른 사람입니다.내가 구현한 아래의 솔루션,하지만 뭔가 잘못된 느낌;그것은 같은 것 하나가 있어야 타이머를 사용하여 다르게 사용하거나 다른 물체에서 스레딩 공간입니다.타이머는 듯하여 가장 적합하기 때문에 나는 할 필요가 주기적으로 확인하는 상태이지만,때로는 확인 이상 걸릴 것입 제 간격입니다.이 접근하는 가장 좋은 방법은 이?
// member variable
private static readonly object timerLock = new object();
private bool found = false;
// elsewhere
timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
timer.Elapsed = Timer_OnElapsed;
timer.Start();
public void Timer_OnElapsed(object sender, ElapsedEventArgs e)
{
lock(timerLock)
{
if (!found)
{
found = LookForItWhichMightTakeALongTime();
}
}
}
해결책
을 설정할 수 있습 AutoReset false,다음을 명시적으로 리셋 타이머 작업을 완료한 후 처리하십시오.물론을 처리하는 방법은 정말에 따라 어떻게 당신이 기대 타이머 작동합니다.이 방법을 수행하는 것을 허용한 타이머를 드리프트에서 실제 지정한 간격(으로 중단과 재시작).귀하의 메커니즘을 허용하는 각 구간을 화재 및 처리할 하지만 그것은에서 발생할 수 있습 잔의 처리되지 않은 처리되는 이벤트를 지금 어디 근처의 만기 타이머는 원인 핸들러를 호출합니다.
timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
timer.Elapsed += Timer_OnElapsed;
timer.AutoReset = false;
timer.Start();
public void Timer_OnElapsed(object sender, ElapsedEventArgs e)
{
if (!found)
{
found = LookForItWhichMightTakeALongTime();
}
timer.Start();
}
다른 팁
나는 보통 그것을 처리하는 동안 타이머를 멈추고, 시도/마침내 블록을 입력하고, 완료되면 타이머를 재개합니다.
는 경우 LookForItWhichMightTakeALongTime()
은 시간이 오래 걸릴 것이 좋지 않을 사용하여 System.Windows.Forms.Timer
기 때문에 그렇게 잠 UI 를 실고 사용자는 죽일 수도 있고,응용 프로그램을 생각하는니다.
무엇을 사용할 수 있는 BackgroundWorker
(와 함께 Timer
원하시는 경우).
public class MyForm : Form
{
private BackgroundWorker backgroundWorker = new BackgroundWorker();
public MyForm()
{
InitializeComponents();
backgroundWorker.DoWork += backgroundWorker_DoWork;
backgroundWorker.RunWorkerCompleted +=
backgroundWorker_RunWorkerCompleted;
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = LookForItWhichMightTakeALongTime();
}
private void backgroundWorker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
found = e.Result as MyClass;
}
}
그리고 당신은 호출 할 수 있습니다 RunWorkerAsync()
에서 당신이 원하는 어느 곳에도서 Timer
당신이 원하는 경우.고 있는지 확인하는 경우 BackgroundWorker
가 이미 실행중이기 때문화 RunWorkerAsync()
실행중인 경우 예외가 발생합니다.
private void timer_Tick(object sender, EventArgs e)
{
if (!backgroundWorker.IsBusy)
backgroundWorker.RunWorkerAsync();
}
timer.enabled = false
또는
timer.stop();
그리고
timer.enabled = true
또는
timer.start();
시스템을 사용합니다 .threading.timer like
class Class1
{
static Timer timer = new Timer(DoSomething,null,TimeSpan.FromMinutes(1),TimeSpan.FromMinutes(1));
private static void DoSomething(object state)
{
timer = null; // stop timer
// do some long stuff here
timer = new Timer(DoSomething, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
}
}