2017-09-19 17 views
-1

하나의 WinForm에서 서로 다른 프로세스에 대해 두 개의 타이머를 호출하고 있으며 둘 다 동일한 try-catch 형식을 사용하고 있습니다. 처음 며칠 동안은 정상적으로 작동하고 느리게 시작됩니다. 서버에 부하가 걸리는 것을 볼 수 있습니다. 내 타이머 이벤트가 맞습니까? 이 이벤트에 많은 부하가 걸리지 않습니까?내 Windows 타이머가 완벽하게 실행되고 메모리 누수가 발생하지 않는지 확인하는 방법

내 코드에서 예외가 발생하는 경우에만 타이머를 중지합니다. 나는 예외는 아니지만 내 시간이 멈추지 않을지는 의심 스럽다. 타이머를 두 번째로 시작하면 더 많은로드가 걸리거나 리셋됩니다. 귀중한 조언을 해주세요. 미리 감사드립니다.

내 코드는 다음과 같습니다.

타이머 1 틱 :

private void timerMain_Tick(object sender, EventArgs e) 
{ 
    try 
    { 
     // Retrieve some status and Update 
    } 
    catch (Exception ex) 
    { 
     timerMain.Stop(); 
     MessageBoxHelper.ShowException(LanguagePack.LanguageHelper.GetString(GlobalParameters.Language, "Error_ExecutionEx"), ex); 
    } 
    finally 
    { 
     timerMain.Start(); 
    } 
} 

타이머 2 틱 :

private void timerWorkStep_Tick(object sender, EventArgs e) 
{ 
    try 
    { 
     // Retreive Some value from web proxy and set to label 
    } 
    catch (Exception ex) 
    { 
     timerWorkStep.Stop(); 
     MessageBoxHelper.ShowException(LanguagePack.LanguageHelper.GetString(GlobalParameters.Language, "Error_ExecutionEx"), ex); 
    } 
    finally 
    { 
     timerWorkStep.Start(); 
    } 
} 
+0

타이머 설정에 문제가없는 것으로 보입니다. 코드의 try 부분에서 무엇을하고 있어도 메모리 누수가 발생할 수 있습니다. 타이머가 문제라고 생각하게 된 이유는 무엇입니까? –

+0

의견을 보내 주셔서 감사합니다. 내 이벤트에서는 예외를 제외하고는 타이머를 멈추지 않아도 마침내 timer.start를 호출했습니다. 그래서 내가 느꼈다, 그것은 루프 이상이며 타이머는 여러 인스턴스를 실행합니다. – Mdyahiya

+0

답장을 보내는 사람에게 알리려면 다음과 같이 언급해야합니다. @ninjacoder –

답변

0

나는이 문제를 놓친하지만 그래서 여기 OP에 의해 코멘트 나에게 지적 내 대답했다.

결국 메모리와 리소스를 사용하고 있기 때문에 정확하게 메모리 누수가 있다고 말하지는 않겠지 만, 주석에서 지적한대로 나는 캐치 및 항상 마침내 시작하면 틱이 일정 간격으로 더 자주 실행될 수 있습니다. 아래 예제를 실행하면 내 뜻을 알 수 있습니다.

내 Windows 서비스의 대부분을 정기적으로 타이머를 사용

void Main() 
{ 
    _timer = new System.Timers.Timer(100); 

    _timer.Elapsed += Timer_Elapsed; 

    _timer.Start(); 
} 

private void Timer_Elapsed(object sender, EventArgs e) 
{ 
    try 
    { 
     for (int i = 0; i < 15; i++) 
     { 
      Console.Write(i + " "); 
      Thread.Sleep(10); 
     } 
     Console.WriteLine(); 
    } 
    catch (Exception ex) 
    { 
     _timer.Stop(); 
     Console.WriteLine(ex.Message); 
    } 
    finally 
    { 
     _timer.Start(); 
    } 
} 

private System.Timers.Timer _timer; 

한 번에 여러 눈금을 실행 타이머 그리고 우리는 진드기에 우선으로 타이머를 정지의 패턴을 채택했다 진드기가 끝나면 다시 시작합니다. 시간의 실제로 처리하는 데 걸리는 있기 때문에 정의 된 모든 간격을 실행하지 않습니다 바로 아래 코드의 문제

타이머 패턴 당신이 신뢰할 수있는 실행 모든 시간을 더 원하는 경우

private void Timer_Elapsed(object sender, EventArgs e) 
{ 
    try 
    { 
     _timer.Stop(); 

     //some work 
    } 
    catch(Exception ex) 
    { 

    } 
    finally 
    { 
     _timer.Start(); 
    } 
} 

신뢰할 수있는 간격

public class NextRunCalculator 
{ 
    public double CalculateTimeUntilNextRun() 
    { 
     List<int> processingMinutes = new List<int> { ServiceConstants.RunMinute5 };//this is a list of minutes during the hour you want the service to run 

     int t = int.MaxValue; 
     foreach (var processingMinute in processingMinutes) 
     { 
      var minutesRemaining = processingMinute - DateTime.Now.Minute; 

      if (minutesRemaining <= 0) 
      { 
       minutesRemaining = 60 + minutesRemaining;//change 60 to however often you want the timer to run 
      } 

      if (minutesRemaining < t) 
      { 
       t = minutesRemaining; 
      } 
     } 

     return TimeSpan.FromMinutes(t).TotalMilliseconds; 
    } 
} 

private void Timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    _timer.Stop(); 

    //do work 

    _timer.Interval = _nextRunCalculator.CalculateTimeUntilNextRun(); 
    _timer.Start(); 
} 
01에

타이머 패턴 : 시간 후 5에서, 당신은 이런 식으로 뭔가를 할 필요가있을 것이다

+0

의견을 보내 주셔서 감사합니다. 나 자신도 동일하게 생각하고 코드의 시작 부분에 false를 설정하고 마침내 시도를하기 위해 true로 설정하면 다음 며칠 동안 성능을 모니터링하고 업데이트 할 것입니다. 참고 : 양식이 활성화되어 있고 간격을 15 초로 설정하면 내 타이머가 계속 실행되어야합니다. 희망은 더 잘 수행 될 것입니다. 세부 답변에 다시 한 번 감사드립니다. – Mdyahiya