每秒做一次文件操作有多糟糕?

How bad is it to do file operation every second?

我正在使用 Visual Studio 2008 在 C# 中开发 Windows 表单应用程序,我目前有两个表单 MainFormTimeSettingFormMainForm 始终打开,而 TimeSettingForm 仅在用户单击 MainForm 上的 Button 时打开。

我的程序需要一个事件方法,它只在每天的特定时间发生一次,用户可以在TimeSettingForm 上选择那个时间。由于TimeSettingForm平时是关闭的,设置的时间需要不受重新打开MainForm的影响,我在TimeSettingForm中有一个方法将设置的时间保存在.txt文件中.只能使用DateTimePicker的时间部分来选择时间。

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

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

从 OS 性能角度来看,每秒检查一次文件是可以的。有缓存等,这使得它非常节省资源。 但是,恕我直言,有更好的做法可以实现您的目标。

您正在解决两个问题:

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

b) 活动安排 - 如何在特定时间安排活动。

至于 b) 一种常见的方法是计算(在程序启动、设置更改和事件执行时)距离下一次事件发生还有多少时间,并相应地设置 TimerForEvent.Interval

您当前的解决方案或事件调度不是很稳健,因为不能保证计时器事件每秒准确执行一个。 Windows 不是实时的 OS 并且计时器执行可能会被阻塞几秒钟,这可能会导致在特定执行时间秒丢失滴答声。