作成されたイベントを受け取り、別のスレッドが機能するようにキューに格納する機能する SystemFileWatcher を作成するのに問題があります。この問題に関してここで数え切れないほどのスレッドを読みましたが、この特定の問題に頭を悩ませることはできません。
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Collections;
using System.Threading;
namespace FileSystemWatcherTest
{
class Program
{
public static BlockingCollection<string> processCollection = new BlockingCollection<string>(new ConcurrentQueue<string>());
static void Main(string[] args)
{
string path = @"C:\test\";
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.EnableRaisingEvents = true;
watcher.Filter = "*.*";
watcher.Created += new FileSystemEventHandler(onCreated);
Thread Consumer = new Thread(new ThreadStart(mover));
Consumer.Start();
while (true) ;//run infinite loop so program doesn't terminate untill we force it.
}
static void onCreated(object sender, FileSystemEventArgs e)
{
processCollection.Add(e.FullPath);
}
static void mover()
{
string current;
string processed = @"C:\test\processed\";
while (true)
{
while (processCollection.IsCompleted)
{
Thread.Sleep(1000);
}
while (processCollection.TryTake(out current))
{
System.IO.File.Move(current, processed);
}
}
}
}
}
これは私がテストしたいものです。これが機能しないことは承知しています。ファイルがキュー内に配置されたときにコンソールに書き込むだけで、FSW が機能することを確認しました。私の問題は、ムーバー関数を独自のスレッドで開始しようとしたときに始まります。キューから作業を開始すると、mover 関数と onCreated が通信していないように見えます。
このコードに対する私の期待は、独自のスレッドでムーバー関数を開始し、SFW と一緒に実行することです。私の期待は、blockingcollection にアタッチされた並行キューが自動更新されることです (私は onCreated を介してアイテムをキューに入れます。ムーバーはそのキューに +1 があることを確認します。ムーバーはキューから 1 つ取得し、onCreated はこれを確認します)。おそらく Thread.Sleep の使い方が間違っています。私はもはやblockingcollectionを使用する支持的な理由を持っていません. ロックの使用を見てきましたが、私が理解していることから、concurrentQueue がどのように同期するかにより、これは実際には必要ありません。
最終的な目標は、ランダムなタイミングで入ってくる大量の小さなファイルを処理することです。これらのファイルは .EML です。
可能であれば、何が起こっているのか、この問題を回避するための提案が何であるかについての説明をいただければ幸いです。私は謙虚に来て、私が理解していることはすべて間違っていると言われることを期待しています!
編集:これをコンソール アプリケーションとしてテストしていますが、後でサービスとして使用されます。while (true) ; を追加しました。onCreated() の前に FSW の実行を維持します。