C # больше потоков, чем ожидалось - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю над проектом, где я должен наблюдать за каталогом. Файлы будут развернуты в каталоге одновременно. Это означает, что может быть 7000 файлов, которые будут перемещены в каталог за один раз. Я использую FileSystemWatcher для запуска потока, если новый файл не добавлен в каталог. Если я перемещаю небольшое количество файлов (1-150 файлов, по 20 КБ каждый), начинается правильное количество потоков. Для каждого файла одна нить. Как только я вставляю большее количество этих файлов, это показывает, что было запущено больше потоков, чем в каталоге. Как видите, я распечатываю «тест» и счетчик для каждого запущенного потока. В конце счетчик является большим числом, чем количество вставленных файлов. Чем больше файлов я вставляю, тем больше разница между счетчиком и вставленными файлами. Надеюсь, вы скажете мне, что я делаю не так.

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 голосов
/ 07 сентября 2018

После этой статьи MSDN, событие Created может решить вашу проблему

The 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...