2

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

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# 拥有进程的所有控制权。缺点是线程休眠一小时并且有一个计划任务运行小时。我不介意使用的资源是否可以忽略不计,但我认为一些更有经验的程序员可能有更优雅的解决方案。

4

4 回答 4

3

Thread.Sleep 是个坏主意,请使用计时器(System.Timers)来完成这项工作。有关Timer类的信息,请参阅http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

于 2013-08-09T08:23:55.007 回答
0

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

轮询的替代方法是实际侦听文件写入文件系统时发生的事件。在 .Net 框架中有一个FileSystemWatcher类,您可以使用它来侦听某个目录上的文件系统事件。但是,FileSystemWatcher并非 100% 万无一失,因此两种方法的组合通常是最佳解决方案。

于 2013-08-09T08:28:18.097 回答
0

发出警告以防万一:

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

于 2013-08-09T08:55:22.317 回答
0

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

于 2013-08-09T08:29:19.660 回答