2017-10-11 13 views
0

Visual Studio 2008を使用してC#でWindowsフォームアプリケーションを作成していますが、現在2つのフォームMainFormTimeSettingFormがあります。 MainFormは常に開いていますが、TimeSettingFormMainFormButtonをクリックしたときにのみ開きます。1秒ごとにファイル操作を実行するのはいかがですか?

私のプログラムでは、毎晩という特定の時刻に一度だけが発生し、ユーザーは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を使用しないのですか? 1秒ごとにかなり効率が悪いですが、 '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のパフォーマンスの観点から、毎秒ファイルを確認することはOKです。それは非常にリソース効率的なキャッシュとそのような関与があります。 しかし、IMHO、あなたの目標を達成するためのより良いプラクティスがあります。

次の2つの問題を解決されています

a)のアプリケーション/ユーザ設定の永続性は - https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/using-application-settings-and-user-settings

b)のイベントのスケジュールを参照してください - 特定の時刻にイベントをスケジュールする方法。

Bとして

)一つの共通のアプローチは、次のイベントの発生に左し、それに応じてTimerForEvent.Intervalに設定されているどのくらいの時間)の変化を設定してイベントの実行時に、プログラムの開始時(計算することです。

現在のソリューションまたはイベントのスケジューリングは、タイマーイベントが1秒間に1回だけ実行されることが保証されていないため、堅牢ではありません。 WindowsはリアルタイムOSではなく、タイマーの実行が数秒間ブロックされる可能性があり、特定の実行時間秒の間にティックが失われる可能性があります。

関連する問題