我在创建一个功能正常的 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 的工作原理。当我尝试在它自己的线程中启动移动器功能时,我的问题就开始了。一旦我开始在队列外工作,移动函数和 onCreated 似乎就没有通信了。
我对这段代码的期望是在它自己的线程中启动移动器函数并与 SFW 一起运行它。我的期望是附加到blockingcollection自动更新的并发队列(我通过onCreated将一个项目排入队列,移动器看到它现在对该队列有+1。移动器从队列中取出一个,onCreated看到这个。)我是可能错误地使用了 Thread.Sleep。我不再有使用blockingcollection的支持理由(我最初选择它来处理等待队列填满,并且基本上,不断检查队列以查找要处理的项目)并且愿意将其更改为任何可能的工作。我已经看到了锁的使用,但据我了解,由于 concurrentQueue 是如何同步的,这并不是真正必要的。
最终目标是处理大量随机进入的小文件,在任何给定时间范围从 1 到数百不等。这些文件是 .EML。
如果可能的话,我将非常感谢您解释正在发生的事情以及解决此问题的建议。我谦虚地来,希望被告知我所理解的一切都是不正确的!
编辑:我将其作为控制台应用程序进行测试,但之后将用作服务。我添加了 while (true) ;在 onCreated() 之前保持 FSW 运行。