我正在使用Visual Studio 2008在C#中使用Windows窗体应用程序,目前我有两种窗体MainForm
和TimeSettingForm
。 MainForm
始终处于打开状态,而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
文件读取 。有没有更好的方法来实现这一目标?
我还想知道不断从文件中读取数据的做法有多糟糕。
答案 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不是实时操作系统,计时器执行可能会被阻止几秒钟,这可能导致在特定执行时间秒内丢失滴答。