J'ai environ 1500 fichiers sur un partage pour lesquels j'ai besoin de collecter la chaîne FileVersionInfo. J'ai donc créé une méthode statique dans ma passerelle comme ceci:TPL - Utilisation de la méthode statique par rapport à la méthode struct
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();
}
Et puis utilisé struct FileAndVersion dans un appel PLINQ avec DegreeOfParallelism que c'est d'E/S connexes
resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20)
.Select(r =>
{
var symbolPath = r.Filename;
return new FilenameAndVersion{Filename=symbolPath, Version=GetVersionInfo(symbolPath)};
})
.ToArray();
Plus tard, je modifié struct, FileAndVersion comme:
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();
}
}
Et utilisé:
resultList = dllFilesRows.AsParallel().WithDegreeOfParallelism(20)
.Select(r =>
{
var symbolPath = r.Filename;
return new FilenameAndVersion(symbolPath, String.Empty);
})
.ToArray();
La question est, cela va me aider dans toute façon et est un bon modèle à utiliser? J'ai oublié de mentionner que les fichiers se trouvent sur un serveur auquel RAID 10 avec SAN est rattaché.
Sunit
Les fichiers se trouvent sur un serveur de fichiers auquel SAN est rattaché. – Sunit
@Sunit: Ce que j'ai dit pourrait être encore vrai. Votre réseau est limité, donc vous pourriez trouver que parallel vs sequential ne fait pas de différence, vous êtes toujours lié par la vitesse du réseau. La seule façon de savoir est de le comparer/le profiler. Je suppose que cela dépend probablement fortement de la charge réseau/SAN à ce moment-là, alors faites vos tests pendant les heures de pointe et hors pointe.Vous pourriez trouver que vous feriez mieux de mettre tout cela sur un seul thread de fond qui serait la plupart du temps inactif en attendant le réseau et libérer le CPU pour l'interface graphique ou d'autres travaux. –
Oui, je profilais déjà en utilisant les outils VS2010. Il semble que dans notre cas, le SAN avec un réseau 10RAID/1Gb était en train de gérer donnait un meilleur résultat en utilisant TPL vs synch IO. Donc, pour l'instant, nous avons décidé d'aller dans cette direction. – Sunit