2

これが冗長である場合は申し訳ありませんが、これに関連するすべての質問は異なる方向を指しているようです。また、マルチスレッドプログラミングは初めてです。

FileSystemWatcherのコードには、作成されたイベントを監視するクラスがあります。ファイル システム ウォッチャーの作成されたイベントが独自のスレッドを開始するようです。FileSystemWatcherそのため、作成されたイベントの呼び出されたスレッドで開始された作業が終了する前に、呼び出しスレッドが作業を継続することがあります。私はこれをしたくありません。私のワークフローはシングルスレッドである必要があるため、呼び出し元のスレッドが再開する機会を得る前に、作成されたイベントが作業を終了するのを待ちます。

擬似コード:

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 が最初にデータを取得するのではなく、処理のためにファイルが直接配置されることがあり、それが複数の場所で機能するため、利用可能になったときに独自のソリューションを展開したくありませんでしたFileSystemWatcher

4

1 に答える 1

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);
于 2013-02-02T04:24:48.437 に答える