문제

나는 타이머는 필요하지 않 프로세스 이 이벤트에 처리기 같은 시간입니다.그러나 처리를 한 경과 이벤트 을 방해 다른 사람입니다.내가 구현한 아래의 솔루션,하지만 뭔가 잘못된 느낌;그것은 같은 것 하나가 있어야 타이머를 사용하여 다르게 사용하거나 다른 물체에서 스레딩 공간입니다.타이머는 듯하여 가장 적합하기 때문에 나는 할 필요가 주기적으로 확인하는 상태이지만,때로는 확인 이상 걸릴 것입 제 간격입니다.이 접근하는 가장 좋은 방법은 이?

// 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));
        }



    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top