2017-10-11 2 views
0

Ich arbeite an einer Windows Form Application in C# mit Visual Studio 2008, und ich habe derzeit zwei Formen MainForm und TimeSettingForm. MainForm ist immer geöffnet, während TimeSettingForm nur geöffnet wird, wenn der Benutzer auf Button auf MainForm klickt.Wie schlimm ist es, jede Sekunde Dateioperationen durchzuführen?

Mein Programm benötigt eine Ereignismethode, die nur einmal zu einer bestimmten Zeit jeden Tag auftritt und der Benutzer kann diese Zeit auf TimeSettingForm wählen. Da TimeSettingForm in der Regel geschlossen ist und die eingestellte Zeit nicht durch erneutes Öffnen MainForm beeinflusst werden muss, habe ich eine Methode in TimeSettingForm, die die eingestellte Zeit in .txt Datei speichert. Die Zeit kann nur mit dem Zeitabschnitt DateTimePicker ausgewählt werden.

Nun, ich habe eine Timer Steuerung, die jede Sekunde läuft, und es liest ständig von der .txt Datei der eingestellte Zeit für das Ereignis abgerufen werden, weil die Zeit leicht auf TimeSettingForm umziehen kann, anstatt eine feste Zeit.

/*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"; 
    } 
} 

Dies scheint jedoch sehr ineffizient, weil es nicht nur die Überprüfung nicht halten, wenn die aktuelle Zeit die gleiche wie die eingestellte Zeit ist, aber es hält auch aus der .txt Datei jede Sekunde lesen. Gibt es einen besseren Weg, dies zu erreichen? Ich möchte auch wissen, wie schlecht es ist, ständig Daten aus einer Datei zu lesen.

+6

Warum nicht einen 'FileSystemWatcher' verwenden? Jede Sekunde ist ziemlich ineffizient, aber Sie tun nicht viel, abgesehen von dem Aufruf von 'File.Exists()', so dass das Endergebnis den Rechner nicht allzu sehr beeinträchtigt. Noch besser ist es, das Zeitintervall auf mindestens – DiskJunky

+0

zu erweitern. Perfekter Anwendungsfall für einen ['FileSystemWatcher'' (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs. 110% 29.aspx? F = 255 & MSPPError = -2147217396). –

+1

Warum nicht den Wert in MainForm beibehalten? Wenn ein Ereignis oder ein Formular geschlossen wird, wird die Datei für eine so einfache Sache nicht überwacht. –

Antwort

0

Überprüfen der Datei jede Sekunde ist aus Sicht der Betriebssystemperformance OK. Es gibt Caching und solche beteiligt, die es sehr ressourceneffizient macht. Allerdings, IMHO, gibt es bessere Praktiken, um Ihr Ziel zu erreichen.

Sie lösen zwei Probleme:

a) application/Benutzereinstellungen Persistenz - https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/using-application-settings-and-user-settings

b) Ereignisplanung sehen - wie bei der spezifischen Zeit ein Ereignis zu planen.

Wie bei b) besteht ein gängiger Ansatz darin, zu berechnen, wie viel Zeit bis zum Auftreten des nächsten Ereignisses verbleibt (beim Programmstart, Änderung der Einstellung und bei der Ausführung des Ereignisses) und TimerForEvent.Interval entsprechend einzustellen.

Ihre aktuelle Lösung oder Ereignisplanung ist nicht sehr robust, da nicht garantiert ist, dass das Timer-Ereignis genau einmal pro Sekunde ausgeführt wird. Windows ist kein Echtzeitbetriebssystem und die Ausführung des Timers könnte für einige Sekunden blockiert sein, was dazu führen könnte, dass das Häkchen zur bestimmten Ausführungszeit als zweites fehlt.

Verwandte Themen