更正等待轮询以每小时加载一个文件,直到某个时间

本文关键字:文件 一个 时间 等待 加载 每小时 | 更新日期: 2023-09-27 18:27:03

我想知道以下代码片段是否正确:

Logger.Debug("Check file exists for corresponding path: {0}.", filePath);
var timeDeadline = DateTime.Today + Settings.Default.FileDeadline; //Timespan type
while (!File.Exists(filePath))
{
    if (DateTime.Now > timeDeadline)
        Logger.Error("The file is not available: {0}.", filePath);
    Logger.Info("The file is not yet available. Waiting for 1 hour...");
    Thread.Sleep(TimeSpan.FromHours(1));
}

这段代码的目的是在早上用Windows任务调度程序安排加载一个文件,该文件通常在9:00左右到达,但可能会延迟数小时,最后需要在14:30(FileDeadline)之前,如果仍然丢失,我会将丢失的文件报告为错误。

我也可以在每小时抛出一个异常,允许windows任务每小时重新启动一次进程,但我认为最好让C#来控制这个进程。缺点是线程睡眠一个小时,并且有一个计划任务运行数小时。我不介意使用的资源是否可以忽略不计,但我认为一些更有经验的程序员可能会有一个更优雅的解决方案。

更正等待轮询以每小时加载一个文件,直到某个时间

线程。睡眠是个坏主意,使用计时器(System.Timers)来完成这项工作。看见http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx有关计时器

的信息

如果你想安排一些事情,我的建议是使用Quartz.Net,它在灵活性和长期维护方面远远优于Windows任务。

轮询的另一种选择是实际侦听在文件系统中写入文件时发生的事件。在.Net框架中,有一个FileSystemWatcher类,可以用来侦听某个目录上的文件系统事件。然而,FileSystemWatcher并不是100%傻瓜式的,因此这两种方法的组合通常是最好的解决方案。

您也可以使用FileSystemWatcher,尽管我听说它可能不可靠http://msdn.microsoft.com/en-gb/library/system.io.filesystemwatcher.aspx

在情况下发出警告

如果你正在等待的文件通过FTP(或创建"增长文件"的东西)进行通信,可能会发生这样的情况:你会收到一个事件,告诉你的文件在那里,但它并不完整。方法File.exists也将返回true。即使您的文件是部分文件。