我想知道在哪里可以找到一些示例代码在C#中执行此操作:
BackGroundWorker 定期(例如,每秒4次)检查.txt文件以查看其中的一个特定字符串,例如“我已完成”。写在文件中。
一旦 BackGroundWorker 发现.txt中存在此类字符串,就会触发事件变为 true 。
我是C#的新手,所以一些样本会受到高度赞赏。非常感谢。
答案 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
。
具体的区别似乎是System.Timers.Timer适用于多线程应用程序,因此通过其SynchronizationObject属性是线程安全的,而System.Threading.Timer具有讽刺意味的是不是线程安全的开箱即用的
我不认为两者之间存在差异,因为它与你的间隔有多小有关。
还有一个链接可以全面解释计时器。
答案 2 :(得分:1)
已经内置了这项功能。尝试使用FileWatcher
类。
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx