Почему компьютеру требуется разное время для одной и той же операции ввода-вывода файла?C#

Место общения программистов C#
Ответить
Anonymous
 Почему компьютеру требуется разное время для одной и той же операции ввода-вывода файла?

Сообщение Anonymous »

Следующая команда считывает файлы по указанному пути к папке.

Код: Выделить всё

allFiles = await readAllFilesAtRootFolder("H:/Sorted images/2010", extensions, chkSubFolders.Checked, cancellationToken);
Затем следующая функция обновляет каждый файл в allFiles с датой EXIF ​​и размером файла.

Код: Выделить всё

readAllEXIFdates(fileQueue, allFiles, _cancellationTokenSource.Token);
Они выполняются в потоках, чтобы избежать зависания формы. (Та же проблема, даже если не в цепочках)
Моя проблема заключается в том, что функция readAllEXIFdates иногда занимает минуты, а иногда и секунды при первом запуске.
Я тестировал это по тому же пути впервые с момента загрузки приложения, чтобы избежать какого-либо влияния со стороны ОС, кэширующей файлы, если это произойдет.
Это функция. р>

Код: Выделить всё

public static void readAllEXIFdates(ConcurrentQueue fileQueue,  ConcurrentDictionary EXIF_Dictionary,  CancellationToken cancellationToken)
{
mediaFile[] files = fileQueue.ToArray();
foreach (var key in EXIF_Dictionary.Keys)
{
mediaFile mFile = new mediaFile();
//foreach (var file in EXIF_Dictionary[key])
if (EXIF_Dictionary.TryGetValue(key, out var mediaFilesList))

{
if (cancellationToken.IsCancellationRequested)
break;

{
for (int i = 0; i < mediaFilesList.Count; i++)
{
mFile = getImageExifDate(mediaFilesList[i].fileName);

mediaFilesList[i].exif_date = mFile.exif_date;
mediaFilesList[i].fileSize = mFile.fileSize;
fileQueue.Enqueue(mediaFilesList[i]);
}
}
}
}
}

public static mediaFile getImageExifDate(string fileName)
{
mediaFile mFile = new mediaFile();
long fSize = 0;
try
{
mFile.fileName = fileName;
var metaData = ImageMetadataReader.ReadMetadata(fileName);
var exifDirectory = metaData.OfType().FirstOrDefault();
fSize = new System.IO.FileInfo(fileName).Length;

if (exifDirectory != null && exifDirectory.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out DateTime dateTimeOriginal))
{
DateTime exifdate = dateTimeOriginal;
mFile.exif_date = exifdate.ToString();
//return exifdate.ToString();
}
else
{
DateTime modification = System.IO.File.GetLastWriteTime(fileName);        // Last time file modified.
mFile.exif_date = modification.ToString();
//return modification.ToString();
}
}
catch
{
DateTime modification = System.IO.File.GetLastWriteTime(fileName);        // Last time file modified.
mFile.exif_date = modification.ToString();
}
long k = fSize;
mFile.fileSize = string.Format("{0:N2} MB", (Double)fSize / (1024.0 * 1024.0));
return mFile;
}
Единственная функция, которая может замедлить работу, — это getImageExifDate, но даже если она отключена, это не повлияет на общую скорость.
Какой совет?


Подробнее здесь: https://stackoverflow.com/questions/793 ... -operation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»