2

サードパーティのソフトウェアによって作成された新しいファイルの特定のフォルダーを監視し、それらをリポジトリにコピーして、1 つずつ Web サービスに送信するアプリケーションを作成する必要があります。ファイルが送信されると、リポジトリから削除されます。

私は明らかにファイル監視に FileSystemWatcher を使用し、それらをリポジトリにコピーします。次に、コピーしたファイル名をキューにエンキューします。

ここからどうすればいいですか?ファイルが送信されたときにこのキューとデキューを管理するにはどうすればよいですか? もう 1 つの質問は、Queue がさまざまなスレッド (FileSystemWatcher) からアクセスされているため、これをスレッドセーフにする方法です。

これを実装するための最良かつ最も安全な方法は何ですか?

ご回答ありがとうございます、SkyFox

4

2 に答える 2

3

初めに:

BlockingCollection<string> q = new BlockingCollection<string>();
var bg = new BackgroundWorker();
bg.DoWork += (s,e) => SendFilesToServer();
bg.RunWorkerAsync();

ファイルウォッチャーイベント(ファイルが作成された):

q.Add(fileName);

働く人':

void SendFilesToServer()
{
    string filename;
    try
    {
        while(true)
        {
            while (q.TryTake(out fileName))
            {
                // Send to the webservice
            }
            while(q.IsEmpty)
                Thread.Sleep(100);
        }
    }
    catch (InvalidOperationException)
    {
    }
}
于 2013-02-05T01:37:38.097 に答える
0

複数のファイルウォッチャーに複数のスレッドは必要ないと思います。(おそらく私はあなたの声明を誤解しています。)また、なぜあなたがキューを必要とするのかわかりません。

アプリケーションのメインスレッドでファイルウォッチャーを実行しますか。ファイルウォッチャーイベントが発生すると、ワーカースレッドを開始して各ファイル操作を処理し、関連する実際の作業を実行できます(ファイルごとに1つのスレッド)。スレッド化された操作は互いに独立しているため、スレッドの安全性について心配する必要はありません。ウォッチャーは、同じファイルで2つの通知イベントが発生しないように、ファイルシステム通知イベントの分離を処理する必要があります。

于 2013-02-04T19:36:59.797 に答える