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

【问题讨论】:

    标签: c# file-upload scheduled-tasks polling thread-sleep


    【解决方案1】:

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

    的信息

    【讨论】:

    • 哦,你的意思是在另一个线程上运行 Sleep(),而不是已经存在的那个?为什么这是一个更好的主意?
    • 使用 Timer 类,您根本不需要 Thread.Sleep 方法,请参阅stackoverflow.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。即使您的文件不完整。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2022-10-15
        • 2019-12-04
        • 1970-01-01
        • 2022-01-25
        相关资源
        最近更新 更多