C# 更正在某个时间之前每小时轮询加载文件的等待时间

C# 更正在某个时间之前每小时轮询加载文件的等待时间,c#,file-upload,scheduled-tasks,polling,thread-sleep,C#,File Upload,Scheduled Tasks,Polling,Thread Sleep,我想知道下面的代码片段是否正确: 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.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(文件截止日期)之前加载,如果仍然丢失,我将报告丢失的文件为错误


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

Thread.Sleep是个坏主意,使用计时器(System.Timers)来完成这项工作。
有关计时器的信息,请参见。如果您想安排时间,我的建议是使用在灵活性和长期维护方面远远优于Windows任务的计时器


轮询的另一种方法是实际侦听在文件系统中写入文件时发生的事件。在.Net framework中,有一个
FileSystemWatcher
类,您可以使用它来侦听特定目录上的文件系统事件。但是,FileSystemWatcher是一个很好的解决方案,所以这两种方法的结合通常是最好的解决方案。

您也可以使用FileSystemWatcher,尽管我听说它可能不可靠 在下列情况下突出警告:

如果您正在通过FTP等待通信的文件(或创建“成长文件”的文件),您可能会收到一个事件,告诉您的文件在那里,但它不完整。
方法File.exists也将返回true。即使你的文件是部分的。

关于FileSystemWatcher,你比我抢先一步!哦,你是说在另一个线程上运行Sleep(),而不是在已经存在的线程上?为什么这是一个更好的主意?对于Timer类,您根本不需要Thread.Sleep方法,有关Thread.Sleep的问题,请参阅。