2016-05-25 2 views
0

Je comprends que lorsque vous téléchargez les emails du serveur, c'est lent. Mais lors de l'exécution du programme et de la lecture/chargement des messages à partir du disque dur est-il possible de le rendre plus rapide?Pourquoi lors du chargement de messages à partir du disque dur en utilisant MimeKit, c'est très lent?

Dans le constructeur je commence un travailleur de fond

DirectoryInfo di = new DirectoryInfo(emailsDirectory); 
      files = di.GetFiles(); 
      if (files.Length > 0) 
      { 
       backgroundWorker2.RunWorkerAsync(); 
      } 

Puis, en cas DoWork

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) 
     { 
      int counter = 0; 
      MimekitallLoadedMessages = new List<MimeKit.MimeMessage>(); 
      MimeKit.MimeMessage loadedMessage = null; 
      DirectoryInfo di = new DirectoryInfo(emailsDirectory); 
      FileInfo[] files = di.GetFiles(); 
      for (int i = 0; i < files.Length; i++) 
      { 
       string uid = seenUids[0]; 
       loadedMessage = MimeKit.MimeMessage.Load(files[i].FullName); 
       MimekitallLoadedMessages.Add(loadedMessage); 
       downloaded.Add(seenUids[i]); 
       counter += 1; 
       int nProgress = counter * 100/files.Length; 
       backgroundWorker2.ReportProgress(nProgress); 
      } 
     } 

Ensuite, l'événement ProgressChanged où je mettre à jour un pbt1 ProgressBar et un listView (ListViewCostumControl.lvnf)

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      pbt1.Value = e.ProgressPercentage; 
      pbt1.Text = e.ProgressPercentage.ToString() + "%"; 
      pbt1.Invalidate(); 
      ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[] 
      { 
       MimekitallLoadedMessages[countUploadMsg].From.ToString(),   //From Column 
       MimekitallLoadedMessages[countUploadMsg].Subject,     //Subject Column 
       MimekitallLoadedMessages[countUploadMsg].Date.ToString()  //Date Column 
      })); 
      countUploadMsg += 1; 
     } 

Et c'est la partie de classe de la pbt1 peut-être cette faites-le lentement? Pas sûr

public class ProgressBarWithText : ProgressBar 
     { 
      const int WmPaint = 15; 
      SizeF TextSize; 
      PointF TextPos; 
      bool dontpaint = false; 

      public ProgressBarWithText() 
      { 
       this.DoubleBuffered = true; 
       this.TextChanged += ProgressBarWithText_TextChanged; 
       this.SizeChanged += ProgressBarWithText_SizeChanged; 
      } 

      public override string Text 
      { 
       get { return base.Text; } 
       set { base.Text = value; } 
      } 

      void RecalcTextPos() 
      { 
       if (this.IsDisposed == true) 
        return; 
       if (string.IsNullOrEmpty(base.Text)) 
        return; 

       using (var graphics = Graphics.FromHwnd(this.Handle)) 
       { 
        TextSize = graphics.MeasureString(base.Text, this.Font); 
        TextPos.X = (this.Width/2) - (TextSize.Width/2); 
        TextPos.Y = (this.Height/2) - (TextSize.Height/2); 
       } 
      } 

      void ProgressBarWithText_SizeChanged(object sender, EventArgs e) 
      { 
       RecalcTextPos(); 
      } 

      void ProgressBarWithText_TextChanged(object sender, EventArgs e) 
      { 
       RecalcTextPos(); 
      } 

      protected override void WndProc(ref System.Windows.Forms.Message m) 
      { 
       base.WndProc(ref m); 

       if (dontpaint == false) 
       { 
        switch (m.Msg) 
        { 
         case WmPaint: 
          using (var graphics = Graphics.FromHwnd(Handle)) 
           graphics.DrawString(base.Text, base.Font, Brushes.Black, TextPos.X, TextPos.Y); 

          break; 
        } 
       } 
      } 

      protected override CreateParams CreateParams 
      { 
       get 
       { 
        CreateParams result = base.CreateParams; 
        result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
        return result; 
       } 
      } 
     } 

L'ensemble du processus de chargement des messages à partir du disque dur semble très lent. Les fichiers sur le disque dur que je lis/charge sont de type eml certains des fichiers taille 8 Ko et quelques 380 Ko un est 4 Mo

Répondre

0

Que considérez-vous être "très lent"?

Avez-vous comparé les performances d'un programme simple qui utilise MimeKit pour charger tous les messages et la durée de votre programme avec les rapports d'avancement?

Avez-vous considéré que vos rapports sur les progrès causaient de la lenteur? En général, vous ne voulez pas signaler de progression après chaque petit travail, vous voulez le signaler seulement quand la progression a changé de manière significative.

Si vous chargez des milliers de messages et que vous redessinez votre interface utilisateur après chaque message, cela représente beaucoup de re-rendu inutile.

Si ce n'est pas encore assez rapide, avez-vous envisagé de ne pas charger tous les messages en mémoire? Pourquoi ne pas les charger seulement quand vous en avez besoin? Le problème est peut-être que vous chargez tant de messages dans la mémoire que cela entraîne l'échange de votre système sur le disque.