FileSystemWatcher について長い間悩まされてきたことの 1 つは、ファイルに対する単一の論理変更に対して複数のイベントを発生させる方法です。理由はわかっていますが、気にする必要はありません。ファイルを 4 ~ 6 回続けて再解析するのではなく、1 回だけ再解析したいだけです。理想的には、途中のすべてのステップではなく、特定のファイルの変更が完了したときにのみ発生するイベントがあります。
何年にもわたって、私はこの問題に対してさまざまな程度の醜さのさまざまな解決策を考え出しました。Reactive Extensions が究極のソリューションになると思っていましたが、私が正しく行っていないことがあり、誰かが私の間違いを指摘してくれることを願っています。
私は拡張メソッドを持っています:
public static IObservable<IEvent<FileSystemEventArgs>> GetChanged(this FileSystemWatcher that)
{
return Observable.FromEvent<FileSystemEventArgs>(that, "Changed");
}
最終的に、特定の期間内にファイル名ごとに 1 つのイベントを取得したいと考えています。これにより、単一のファイル名を持つ連続した 4 つのイベントが 1 つのイベントに削減されますが、複数のファイルが同時に変更されても何も失われません。時間。BufferWithTime
理想的なソリューションのように聞こえます。
var bufferedChange = watcher.GetChanged()
.Select(e => e.EventArgs.FullPath)
.BufferWithTime(TimeSpan.FromSeconds(1))
.Where(e => e.Count > 0)
.Select(e => e.Distinct());
このオブザーバブルをサブスクライブすると、監視対象のファイルを 1 回変更すると、サブスクリプション メソッドが 4 回連続してトリガーされ、目的が果たせなくなります。呼び出しを削除するDistinct()
と、4 つの呼び出しのそれぞれに 2 つの同一のイベントが含まれていることがわかります。そのため、バッファリングが行われています。渡された TimeSpan を増やしBufferWithTime
ても効果がないようです。動作を変更せずに 20 秒まで上げました。
これは Rx への私の最初の進出なので、おそらく明らかな何かが欠けています。私はそれを間違っていますか?より良いアプローチはありますか?提案をありがとう...