每秒做一次文件操作有多糟糕?
How bad is it to do file operation every second?
我正在使用 Visual Studio 2008 在 C# 中开发 Windows 表单应用程序,我目前有两个表单 MainForm
和 TimeSettingForm
。 MainForm
始终打开,而 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 并且计时器执行可能会被阻塞几秒钟,这可能会导致在特定执行时间秒丢失滴答声。
我正在使用 Visual Studio 2008 在 C# 中开发 Windows 表单应用程序,我目前有两个表单 MainForm
和 TimeSettingForm
。 MainForm
始终打开,而 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 并且计时器执行可能会被阻塞几秒钟,这可能会导致在特定执行时间秒丢失滴答声。