Dans mon cas j'ai l'impression que ca ne conviendrait pas parce que ce qui est long dans mon cas est
soit le zipage évoqué tout à l'heure
qui dure 30s mais qui ne gère pas de méthodes async :-(
Soit des boucles très longues. en voici un exemple (pour chaque nom de fichier coché dans un treeviexw, j'ouvre le fichier(un binaire rempli de doubles) et je fais des calculs ligne par ligne pour ajouter des points sur un MSchart :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| foreach (TreeNode node in treeView1.Nodes)
{
foreach (TreeNode ssNode in node.Nodes)
{
if (ssNode.Checked)
{
Boolean PixelEnCours = false;
double DateDebutPixel = Min;
double DateFinPixel = DateDebutPixel + BlocTempsBase;
double ValeurMinPixel = 0;
double ValeurMaxPixel = 0;
double DatePixel = 0;
double CompteurPointsAffiches = 0;
string NomSerie = ssNode.FullPath.ToString();
// Création de la série
chart1.Series.Add(NomSerie); //création de la série de donnée
chart1.Series[NomSerie].ChartType = SeriesChartType.Range; // série de type range pour afficher le min et le max sur la plage de temps du pixel
using (BinaryReader MonReader = new BinaryReader(File.Open(Properties.Settings.Default.CheminTravail + "\\" + ssNode.FullPath, FileMode.Open)))
{
MonReader.BaseStream.Position = 0; // positionnement en début de fichier et recherche dâte minimum
long FinLecture = MonReader.BaseStream.Length; // récupération de la taille du fichier
while (MonReader.BaseStream.Position < FinLecture )
{
double datePoint = MonReader.ReadDouble();
double valeurPoint = MonReader.ReadDouble();
if ((datePoint >= DateDebutPixel) && (datePoint < DateFinPixel)) //si le point est dans la plage de temps du pixel concerné
{
if (PixelEnCours == false) //c'est le premier point a afficher dans ce pixel
{
DatePixel = DateDebutPixel;
ValeurMinPixel = valeurPoint;
ValeurMaxPixel = valeurPoint;
PixelEnCours = true;
}
else // si PixelEnCours == true, c'est au moins le deuxieme point à afficher sur ce pixel
{
if (valeurPoint < ValeurMinPixel) ValeurMinPixel = valeurPoint;
if (valeurPoint > ValeurMaxPixel) ValeurMaxPixel = valeurPoint;
}
}
else if ((datePoint > DateFinPixel) && (datePoint < Max)) //si on est plus dans la plage de temps du pixel concerné
{
if (PixelEnCours == true) // passage au pixel suivant mais s'il y a eu des poitns dans la plage
{
chart1.Series[NomSerie].Points.AddXY(DatePixel, ValeurMinPixel, ValeurMaxPixel); //on charge le dernier pixel dans le graph
CompteurPointsAffiches++;
}
do //recherche pixel concerné par le nouveau point
{
DateFinPixel += BlocTempsBase;
} while (datePoint > DateFinPixel);
DateDebutPixel = DateFinPixel - BlocTempsBase;
DatePixel = DateDebutPixel;
ValeurMinPixel = valeurPoint;
ValeurMaxPixel = valeurPoint;
PixelEnCours = true;
}
else
{
if (PixelEnCours == true) //c'est fini mais il y a un pixel en cours
{
chart1.Series[NomSerie].Points.AddXY(DatePixel, ValeurMinPixel, ValeurMaxPixel);
CompteurPointsAffiches++;
PixelEnCours = false;
}
}
// Modif des markers suivant nombre de points affichés
if (CompteurPointsAffiches < NbPixels / 4)
{
chart1.Series[NomSerie].MarkerStyle = MarkerStyle.Square;
chart1.Series[NomSerie].MarkerColor = Color.Black;
chart1.Series[NomSerie].ToolTip = "#VALY - #VALX{G}";
}
else
{
chart1.Series[NomSerie].ToolTip = "";
chart1.Series[NomSerie].MarkerStyle = MarkerStyle.None;
}
}
}
chart1.Series[NomSerie].IsXValueIndexed = false; // pour avoir les absices dans l'ordre et sans trous
chart1.Series[NomSerie].XValueType = ChartValueType.DateTime; // axe X de type DateTime
}
}
} |
Cette boucle prend jusqu'à 5minutes aujourd'hui avec les plus gros lots de données que j'ai.
Là, dans ce cas, on est d'accord qu'il faut que ma fonction async soit une fraction de la boucle complète pour que je puisse gérer un avancement manuellement dans la boucle qui lancera X fois la fonction async.
Je dois même avouer que vu que le temps d’exécution n'est pas directement du aux opérations de Read dans les StreamReader, je ne vois même pas comment mettre en place le async vu que du coup je n'ai pas de méthodes async longues à gérer.
Merci
Partager