如何等待filesystemwatcher事件完成

时间:2013-01-29 00:09:58

标签: c# multithreading filesystemwatcher

如果这是多余的,请原谅我,但是与此相关的所有问题似乎都指向了不同的方向,我也是多线程编程的新手。

我的代码中有一个FileSystemWatcher类,用于监视已创建的事件。它看起来像文件系统观察程序的创建事件启动它自己的线程。因此,有时调用线程会继续工作,然后在FileSystemWatcher已创建事件的调用线程中启动的工作完成。我不想要这个。我的工作流程需要是单线程的,所以我想要实现的是等待创建的事件在调用线程有机会恢复之前完成它的工作。

pesudo代码:

main() {
FileSystemWatcher fsw = new FileSystemWatcher()
fsw.Path = ini.location;
fsw.Created += new FileSystemEventHandler(OnFileCreation);
fsw.EnableRaisingEvents = true;
main_engine.processDataToFile();
main_engine.processCreatedFile();
}

void OnFileCreation(object sender, FileSystemEventArgs e) {
// do some file processing
// takes time based on size of file and whether file is locked or not etc.
}

void processDataToFile() {
// do some data processing on received data and output to a file. 
}

void processCreatedFile() {
// do not want this method to be called, unless OnFileCreation() finish it's work.
}

选择使用FileSystemWatcher的原因是因为有时直接放置文件进行处理而不是main_engine首先获取数据并且它可以在多个位置上工作,因此不希望在{{1}时推出自行开发的解决方案可用。

1 个答案:

答案 0 :(得分:1)

如果事件在单独的线程中触发,则无法使其成为单线程。因为这不是你的代码。故事的结尾。

但是等待起来非常简单:

...
    me.WaitOne();
    main_engine.processCreatedFile();
}

...

void OnFileCreation(object sender, FileSystemEventArgs e) {
// do some file processing
// takes time based on size of file and whether file is locked or not etc.
...
me.Set();
}

ManualResetEventSlim me = new ManualResetEventSlim(false);