我有一个过程需要间歇性地将一些文件从一个目录移动到另一个目录。在移动文件之前,我需要确保用户当前没有向目录添加文件 - 如果有,我希望等待 N 秒内没有新文件添加到目录,然后再继续该过程(N 的值在这里并不重要)。
我最初的想法是使用FileSystemWatcher
捕获文件创建事件,使用.Throttle()
Rx 中的方法获取指定时间段内生成的最后一个事件,并使用该结果禁用无限延迟循环。问题是,如果用户从未对目录进行任何更改,则此方法将永远等待。不知何故,我需要它等待至少N 秒,如果该时间段内没有变化,则继续。如果该时间段内有变化,则等待自上次更改以来过去 N 秒。
以下是我目前所掌握的信息:
Console.WriteLine("start");
// wait to ensure no changes are being made to the directory
await Task.Run(async () =>
{
var watcher = new FileSystemWatcher("D:\\Users\\mwcjk1\\source\\repos\\RandomTestAppNet8\\RandomTestAppNet8\\");
watcher.EnableRaisingEvents = true;
watcher.Created += (o, a) => { Console.WriteLine("file changed!"); };
var subject = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
ev => watcher.Created += ev,
ev => watcher.Created -= ev
);
bool done = false;
// wait for 7 seconds after the last file creation
var disposable = subject.Throttle(TimeSpan.FromSeconds(7)).Subscribe(events => { done = true; });
Console.WriteLine("Set up observer");
while (!done)
{
await Task.Delay(1000);
//Console.WriteLine("Waited 1 sec");
}
disposable.Dispose();
});
// Continue with the rest of the method execution
Console.WriteLine("done!");
我也不喜欢Task.Delay()
循环——感觉应该有一种更优雅的方式来做到这一点(.Throttle()
看起来很接近独立工作!),但我还没能弄清楚。
非常感谢您的任何建议,谢谢!