BackGroundWorker定期检查文件

时间:2014-01-28 16:49:24

标签: c# multithreading events backgroundworker

我想知道在哪里可以找到一些示例代码在C#中执行此操作:

  1. BackGroundWorker 定期(例如,每秒4次)检查.txt文件以查看其中的一个特定字符串,例如“我已完成”。写在文件中。

  2. 一旦 BackGroundWorker 发现.txt中存在此类字符串,就会触发事件变为 true

  3. 我是C#的新手,所以一些样本会受到高度赞赏。非常感谢。

3 个答案:

答案 0 :(得分:2)

有两种基本策略可以确定是否有变化。您可以民意调查,反复检查是否有任何不同。或者您可以使用事件,即发生更改时自动运行的代码。事件当然 更有效,你不会浪费任何时间和系统资源来完成很少甚至没有。例如,从不轮询按钮以查看用户是否点击了它,而是使用其Click事件。

有时轮询是不可避免的,仅仅因为事件不可用。但肯定有一个文件更改,操作系统支持它。通过FileSystemWatcher类在.NET中公开。强烈建议通过Timer或工作线程,打开并读取文件的每一行以发现“我完成”字符串非常昂贵。

尝试阅读文件时要小心。使用Timer或工作线程时也会出现问题,但更多因为FileSystemWatcher工作得更好。当Change事件触发时,很可能你无法打开文件,因为无论进程写入文件还是锁定它。在它不再被锁定之后,您可能仍需要一个Timer来尝试稍后读取该文件。

答案 1 :(得分:1)

您可能只想使用Timer。示例代码就是这样的

var timer = new Timer(TimerTick, null, TimeSpan.Zero, new TimeSpan(0, 0, 0, 1));

int lastMinute = 1;

void TimerTick(object state)
{
    var minute = DateTime.Now.Minutes;
    if (minute != lastMinute && minute % 5 == 0)
    {
        lastMinute = minute;
        //Check the .txt file
    }
}

正如Thorsten Dittmar指出的那样,是的,您可能希望使用System.Timers.Timer而不是System.Threading.Timer。 Timers.Timer也是thread-safe

根据found here

的答案之一
  

具体的区别似乎是System.Timers.Timer适用于多线程应用程序,因此通过其SynchronizationObject属性是线程安全的,而System.Threading.Timer具有讽刺意味的是不是线程安全的开箱即用的

     

我不认为两者之间存在差异,因为它与你的间隔有多小有关。

还有一个链接可以全面解释计时器。

答案 2 :(得分:1)

已经内置了这项功能。尝试使用FileWatcher类。

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx