2017-10-11 30 views
0

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

+6

为什么不使用'FileSystemWatcher'?每秒钟效率都很低,但除了调用'File.Exists()'外,没有太大的作用,所以最终的结果不会对机器造成太大的影响。更好的做法是至少增加时间间隔 – DiskJunky

+0

['FileSystemWatcher']的完美用例(https://msdn.microsoft.com/zh-cn/library/system.io.filesystemwatcher%28v=vs。 110%29.aspx?F = 255&MSPPError = -2147217396)。 –

+1

为什么不把值保存在MainForm中?一个事件或表单关闭设置它,所以没有必要监视一个文件这么简单的事情。 –

回答

0

从操作系统性能角度来看,每秒检查一次文件是否正常。有缓存和这样的参与,这使得它非常节约资源。 但是,恕我直言,有更好的做法来实现你的目标。

你要解决两个问题:

一)应用/用户设置的持久性 - 见https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/using-application-settings-and-user-settings

二)事件调度 - 如何在特定的时间安排事件。对于b),一种常用的方法是计算(在程序开始时,设置改变和事件执行时)多少时间留给下一个事件发生并相应地设置TimerForEvent.Interval

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