Search code examples
c#multithreadingfilesystemwatcher

how to wait for filesystemwatcher event to finish


Please excuse me if this is redundant, however all the questions related to this seem to point in different directions, also I am new to multithreaded programming.

I have a FileSystemWatcher class in my code, which watches the created event. It looks like a created event of file system watcher starts it's own thread. So sometimes the calling thread continues it's work before the work initiated in called thread of FileSystemWatcher created event finishes. I don't want this. My workflow needs to be single-threaded, so what I want to achieve is wait for for created event to finish it's work before the calling thread gets an opportunity to resume.

pesudo code:

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.
}

The reason choose to use FileSystemWatcher was because sometimes files are directly placed for processing instead of main_engine getting the data first and it works on multiple locations, so did not want to roll out a homegrown solution when FileSystemWatcher was available.


Solution

  • If the event fires in the separate thread you cant make it single-threaded. because this is not your code. end of story.

    however it is quite simple to wait on:

    ...
        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);