У меня около 1500 файлов на общем ресурсе, для которых мне нужно собрать строку FileVersionInfo. Так что я создал статический метод в моем шлюзе так:TPL - Использование статического метода vs struct method
private static string GetVersionInfo(string filepath)
{
FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(filepath);
return string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart,
verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim();
}
, а затем использовали FileAndVersion-структуру в PLINQ вызова с DegreeOfParallelism как это I/O связанных
resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20)
.Select(r =>
{
var symbolPath = r.Filename;
return new FilenameAndVersion{Filename=symbolPath, Version=GetVersionInfo(symbolPath)};
})
.ToArray();
Позже я модифицировал Struct, FileAndVersion как:
private struct FilenameAndVersion
{
private string _version, _filename;
public string Version { get { return _version; } }
public string Filename { get { return _filename; } }
private void SetVersion()
{
FileVersionInfo verInfo = FileVersionInfo.GetVersionInfo(this.Filename);
this._version = string.Format("{0}.{1}.{2}.{3}", verInfo.ProductMajorPart, verInfo.ProductMinorPart,
verInfo.ProductBuildPart, verInfo.ProductPrivatePart).Trim();
}
public FilenameAndVersion(string filename, string version)
{
this._filename = filename;
this._version = string.Empty;
SetVersion();
}
}
И использовали его:
resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20)
.Select(r =>
{
var symbolPath = r.Filename;
return new FilenameAndVersion(symbolPath, String.Empty);
})
.ToArray();
Вопрос в том, что это поможет мне в любом случае и является хорошим шаблоном для использования? Забыл упомянуть, что файлы находятся на сервере с RAID 10 с SAN, прикрепленным к нему.
Sunit
Файлы находятся на файловом сервере с подключенным SAN. – Sunit
@Sunit: То, что я сказал, все еще может быть правдой. Ваш сетевой канал ограничен, поэтому вы можете обнаружить, что параллельный и последовательный файлы не отличаются разницей, но по-прежнему связаны скоростью сети. Единственный способ узнать - проверить или профилировать его. Я подозреваю, что это, вероятно, в значительной степени зависит от нагрузки сети/сан в то время, поэтому запустите свои тесты в часы пик и пиковые часы.Вы можете обнаружить, что вам лучше всего положить эту массу всего на один фоновый поток, который будет в основном бездействовать в ожидании сети и освободить процессор для графического интерфейса или другой работы. –
Да, я уже профилировал с помощью инструментов VS2010. Похоже, что в нашем случае SAN с сетью 10RAID/1Gb занимался обработкой, давая лучший результат, используя TPL vs synch IO. Так что пока мы решили пойти по этому маршруту. – Sunit