C#启动的线程多于预期

时间:2018-09-07 11:44:37

标签: c# multithreading filesystemwatcher

我正在一个必须观察目录的项目中。这些文件将同时部署在目录中。这意味着可能有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++;
        }

1 个答案:

答案 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;
}