0

C# でコード化された Visual Studio 2012 で Windows 用のソフトウェアを作成しています。

FileSystemWatcher クラスを使用して、ディレクトリの変更を監視しています。1 つ以上の新しいファイルがディレクトリに追加されると、FileSystemEventHandler クラスによってイベントが発生します。

このイベントは、ファイル名を配列に追加します。

次に、配列を処理します。つまり、配列内のすべてのファイル (ファイル名を介してアクセス) を処理し、ファイルに対して何かを行います。

今: ファイル処理が順番に行われるようにする必要があります。ファイル 1 を見て処理し、それが終わったらファイル 2 を見て処理する、というように。

ファイルの処理には、1 ファイルあたり約 5 秒かかります。その間、新しいファイルをディレクトリに追加できるため、これらの変更により FileSystemEventHandler クラスが起動します。しかし、私はこれが発生することを望んでいません.一度に処理されるファイルは常に1つだけであるべきです.変更のイベントが何回発生するかに関係なく!

どなたか、このパターン (またはコード スニペット) を教えていただけないでしょうか?!

4

5 に答える 5

2

I think following class would be optimal,

BlockingCollection<T> Class

Provides blocking and bounding capabilities for thread-safe collections that implement IProducerConsumerCollection.

It acts as concurrent queue and you can process items async using Tasks.

Alternative would be ConcurrentQueue<T>, But The BlockingCollection gives you two important features

スレッドセーフです

を呼び出すとTake()、ブロックされます (キューに何かが入るまで待機します)。そのため、ManualResetEvents などでコードを記述する必要はありません。

于 2013-10-22T07:35:56.637 に答える
1

必要なパターンは、FileSystemEventHandler が単純にファイル名を共有キューに追加するパターンです。

次に、このキューを別のスレッドが個別に監視できるようになり、別のスレッドがアイテムをキューから削除して処理します。

このように、ファイルの処理中にイベント ハンドラーがアイテムを追加するのを「停止」する必要はありません。さらに追加し続けることができ、ワーカースレッドには影響しません。

処理するファイルのリストを管理するには、 ConcurrentQueue クラスのようなものをお勧めします。

Microsoft による次のサンプル コードは、BlockingCollection (ConcurrentQueue をラップする) を使用してこれを実現する方法を示しています。

http://msdn.microsoft.com/en-us/library/dd997371.aspx

于 2013-10-22T07:34:23.800 に答える
0

ブール変数を設定できます。この変数は、別のファイルが処理中の場合は true に設定され、処理が完了した後は false に設定されます。一方、FileSystemEventHandler が新しいイベントを発生させると、変数がチェックされ、true に設定されている場合は待機します。それ以外の場合は、変数を true に設定し、キャリーオンします。

于 2013-10-22T07:37:26.017 に答える