每秒进行文件操作有多糟糕?

时间:2017-10-11 14:47:35

标签: c# timer file-read

我正在使用Visual Studio 2008在C#中使用Windows窗体应用程序,目前我有两种窗体MainFormTimeSettingFormMainForm始终处于打开状态,而TimeSettingForm仅在用户点击Button上的MainForm时打开。

我的程序需要一种事件方法,该方法每天只在某个时间发生,用户可以在TimeSettingForm上选择该时间。由于TimeSettingForm通常已关闭且设置时间不受重新打开MainForm的影响,因此TimeSettingForm中有一个方法可将设置时间保存在.txt文件中。只能使用DateTimePicker的时间部分来选择时间。

现在,我有一个Timer控件每秒运行一次,它会不断从.txt文件中读取以检索事件的设置时间,因为TimeSettingForm上的时间很容易被更改1}},而不是固定的时间。

/*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文件读取 。有没有更好的方法来实现这一目标? 我还想知道不断从文件中读取数据的做法有多糟糕。

1 个答案:

答案 0 :(得分:0)

从OS性能角度来看每秒检查文件是否正常。有缓存和这样的涉及使其非常资源有效。 但是,恕我直言,有更好的做法来实现你的目标。

您正在解决两个问题:

a)应用程序/用户设置持久性 - 请参阅https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/using-application-settings-and-user-settings

b)事件安排 - 如何在特定时间安排事件。

至于b)一种常见的方法是计算(在程序启动,设置更改和事件执行时)下一个事件发生的剩余时间,并相应地设置TimerForEvent.Interval

您当前的解决方案或事件调度不是很强大,因为无法保证定时器事件每秒只执行一次。 Windows不是实时操作系统,计时器执行可能会被阻止几秒钟,这可能导致在特定执行时间秒内丢失滴答。