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

Posted

技术标签:

【中文标题】正确等待轮询每小时加载文件,直到某个时间【英文标题】:Correct wait to poll for loading a file every hour until a certain time 【发布时间】:2013-08-09 08:16:21 【问题描述】:

我想知道下面的代码 sn-p 是否正确:

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

【问题讨论】:

【参考方案1】:

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

的信息

【讨论】:

哦,你的意思是在另一个线程上运行 Sleep(),而不是已经存在的那个?为什么这是一个更好的主意? 使用 Timer 类,您根本不需要 Thread.Sleep 方法,请参阅***.com/questions/8815895/… 了解与 Thread.Sleep 相关的问题。【参考方案2】:

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

轮询的另一种方法是实际监听文件写入文件系统时发生的事件。在 .Net 框架中有 FileSystemWatcher 类,您可以使用它来侦听某个目录上的文件系统事件。但是,FileSystemWatcher 是not 100% fool proof,所以这两种方法的组合通常是最好的解决方案。

【讨论】:

你在 FileSystemWatcher 方面打败了我!【参考方案3】:

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

【讨论】:

【参考方案4】:

以防万一:

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

【讨论】:

以上是关于正确等待轮询每小时加载文件,直到某个时间的主要内容,如果未能解决你的问题,请参考以下文章

轮询 url 直到响应为某个值

BizTalk WCF_SQL 轮询

Java 使用 CountDownLatch 轮询方法直到成功响应

Java 和 Spring - 轮询 http 端点,直到服务器完成处理

php轮询是不是需要

Django,Ajax 长轮询,Postgresql:空闲事务