2015-02-26 2 views
0
  1. У меня есть два потока в C# Windows услуги с течением времени
  2. Когда время вызывает как поток начинает одновременно для извлечения файлов с сетевого сервера на одной и той же папке
  3. только отличие от thread1 и thread2 - размер файла, thread1 принимает файлы размером менее 10 МБ, а thread2 занимает больше 5 МБ.
  4. Так что мой вопрос в том, что с использованием Directory.GetFiles или Directory.EnumerateFiles он будет конфликтовать с файлом исключения, который не найден, потому что я вижу эту ошибку в моем журнале?

thread1:многопоточной Directory.GetFiles с лямбда-выражения

foreach (var file in 
    Directory 
     .EnumerateFiles(serverConfig["stagingFolder"]) 
     .Select(s => new FileInfo(s)) 
     .Where(s => 
      !s.Name.StartsWith(".") 
      && !s.Name.EndsWith(".tmp") 
      && !s.Name.EndsWith(".stdf.gz") 
      && s.Length < size)) 

thread2

foreach (string file in 
    Directory 
     .EnumerateFiles(serverConfig["stagingFolder"], "*", SearchOption.TopDirectoryOnly) 
     .Where(s => 
      !new FileInfo(s).Name.StartsWith(".") 
      && !s.EndsWith(".tmp") 
      && !s.EndsWith(".stdf.gz") 
      && new FileInfo(s.ToString()).Length > size)) 
+0

Почему вы используете два потока? Почему бы и нет? Почему не больше? – Enigmativity

ответ

0

Согласно docs, EnumerateFiles не может потерпеть неудачу с исключением FileNotFound. Так что это другая часть, где вы создаете объект FileInfo. Пробовали ли вы печатать путь и CWD, чтобы убедиться, что полный путь присутствует? Возможно, вам нужно сослаться на файл как new FileInfo(serverConfig["stagingFolder"] + Path.PathSeparator + s)

И, чтобы ответить на ваш другой вопрос, EnumerateFiles должен быть потокобезопасным. Документы не говорят об этом явно, но нет оснований полагать, что вызовы функций EnumerateFiles совместно используют скрытое состояние друг с другом.

+0

Я получаю сообщение об ошибке «не могу разрешить символ s», когда я использую ваш метод таким образом foreach (файл var в каталоге.EnumerateFiles (new FileInfo (serverConfig ["stagingFolder"] + Path.PathSeparator + s) можете ли вы дать мне рабочий цикл, так как я новичок в C# –

+0

Просто измените аргумент конструктора FileInfo. Ваша версия уже содержит 's', поэтому она не должна выходить за рамки. – piojo