我正在一个必须观察目录的项目中。这些文件将同时部署在目录中。这意味着可能有7000个文件立即被移到该目录中。如果将新文件ist添加到目录,我正在使用FileSystemWatcher触发线程。如果我要移动少量文件(1-150个文件,每个20 KB),则会启动适当数量的线程。对于每个文件一个线程。一旦我粘贴了大量的这些文件,就表明启动的线程数超过了目录所包含的数量。如您所见,我正在打印“ test”和每个启动线程的计数器。最后,计数器的数量大于粘贴文件的数量。我粘贴的文件越多,计数器文件和粘贴的文件之间的差异就越大。希望你能告诉我我在做什么错。
public static void Main(string[] args)
{
Queue queue = new Queue();
queue.Watch();
while (true)
{
}
}
public void Watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "directorypath\\";
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
public void OnChanged(object source, FileSystemEventArgs e)
{
WaitForFile(e.FullPath);
thread = new Thread(new ThreadStart(this.start));
thread.Start();
thread.Join();
}
private static void WaitForFile(string fullPath)
{
while (true)
{
try
{
using (StreamReader stream = new StreamReader(fullPath))
{
stream.Close();
break;
}
}
catch
{
Thread.Sleep(1000);
}
}
}
public void start()
{
Console.WriteLine("test" +counter);
counter++;
}
答案 0 :(得分:1)
遵循此article MSDN,Created
事件可以解决您的问题
M:System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs) 创建文件后立即引发事件。如果文件正在 复制或转移到监视目录中 M:System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs) 活动将立即引发
public void Watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "directorypath\\";
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}