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



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

从操作系统性能的角度来看,每秒检查一次文件是可以的。其中包括缓存等,这使得它具有非常高的资源效率。然而,IMHO,有更好的实践可以实现您的目标。

您正在解决两个问题:

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

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

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

您当前的解决方案或事件调度不是很健壮,因为它不能保证计时器事件每秒执行一次。Windows不是实时操作系统,计时器的执行可能会被阻止几秒钟,这可能会导致在特定的执行时间秒缺少勾号。

最新更新