2017-10-11 16 views
0

Visual Studio 2008을 사용하는 C#의 Windows Form 응용 프로그램에서 작업 중이며 현재 두 개의 양식 MainFormTimeSettingForm이 있습니다. MainForm은 항상 열려 있고 TimeSettingFormButtonMainForm에있을 때만 열립니다.매초마다 파일 작업을 수행하는 것이 얼마나 안 좋은가요?

내 프로그램에는 매일이라는 특정 시간에 한 번만 번 발생하는 이벤트 메서드가 필요하며 사용자는 TimeSettingForm에서 해당 시간을 선택할 수 있습니다. TimeSettingForm은 대개 닫히고 설정 시간은 MainForm을 다시 열어도 영향을받지 않아야하므로 설정 시간을 .txt 개로 저장하는 TimeSettingForm에 있습니다. 시간은 DateTimePicker의 시간 부분 만 사용하여 선택할 수 있습니다.

는 지금, 나는 매 초마다 실행되는 Timer 제어 할 수 있습니다, 그것은 지속적으로 시간을 쉽게 오히려 고정 된 시간보다 TimeSettingForm에 변경 얻을 수 있기 때문에, 이벤트에 대한 설정 시간을 검색 할 .txt 파일에서 읽습니다.

/*Timer control that runs every second */ 
private void TimerForEvent_Tick(object sender, EventArgs e) 
{ 
    string eventTime; 
    string fileName = GetFileName(); //Get the .txt file name here 
    if (File.Exists(fileName)) 
    { 
     //Read line 
     using (StreamReader sr = new StreamReader(fileName)) 
     { 
      //Event time is in format of "HH:mm" 
      eventTime = sr.ReadLine(); 
     } 

     //Separate into hour and minute portion 
     DateTime dt = Convert.ToDateTime(eventTime); 
     int eventHour = dt.Hour; 
     int eventMinute = dt.Minute; 

     //Check if the current time matches the eventTime 
     DateTime DTnow = DateTime.Now; 
     if(DTnow.Hour == eventHour && DTnow.Minute == eventMinute && DTnow.Second == "0") 
     { 
      //The event happens 
     } 
    } 
    else 
    { 
     eventTime = "Time Not Set"; 
    } 
} 

그러나, 이것은 현재 시간이 설정 시간과 같은 경우 계속 확인 않을뿐만 아니라 때문에 매우 비효율적 인 것뿐만 아니라, 그것은 .txt 파일 초마다에서 읽는 유지합니다. 이것을 달성하기위한 더 좋은 방법이 있습니까? 파일에서 데이터를 지속적으로 읽는 것이 얼마나 안 좋은지 알고 싶습니다.

+6

왜 'FileSystemWatcher'를 사용하지 않습니까? 초마다 매우 비효율적이지만'File.Exists() '를 호출하는 것과 별개로 작업하지 않으므로 최종 결과는 그만큼의 시스템에 영향을 미치지 않습니다. 최소한 시간 간격을 늘리는 것이 더 좋다. – DiskJunky

+0

['FileSystemWatcher'] (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs)의 완벽한 유스 케이스. 110 % 29.aspx? f = 255 & MSPPError = -2147217396). –

+1

왜 MainForm에 값을 유지하지 않습니까? 이벤트 나 폼 클로즈로 설정하면 파일을 모니터링 할 필요가 없습니다. –

답변

0

OS 성능 관점에서 매 초마다 파일을 확인하는 것이 좋습니다. 매우 자원 효율적으로 만드는 캐싱과 관련이 있습니다. 그러나 IMHO, 목표 달성을위한 더 나은 방법이 있습니다.

당신은 두 가지 문제가 해결됩니다

A) 응용 프로그램/사용자 설정 지속성 - https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/using-application-settings-and-user-settings

B) 이벤트 일정을 참조 - 특정 시간에 이벤트를 예약하는 방법.

b)에 대한 한 가지 일반적인 접근법은 (프로그램 시작, 변경 설정 및 이벤트 실행시) 다음 이벤트 발생까지 남은 시간을 계산하고 이에 따라 TimerForEvent.Interval을 설정하는 것입니다.

타이머 이벤트가 초당 정확히 하나씩 실행된다는 보장이 없기 때문에 현재 솔루션이나 이벤트 일정은 그리 강력하지 않습니다. Windows는 실시간 OS가 아니며 타이머 실행이 몇 초 동안 차단되어 특정 실행 시간 초에 진드기가 누락 될 수 있습니다.