0

In a backgroundworker dowork event

private int numberofallmessages = 0;
        private int countMsg = 0;
        private int nProgress = 0;
        private HashSet<string> downloaded = new HashSet<string>();

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            using (var client = new Pop3Client())
            {
                client.Connect(textServer.Text, Convert.ToInt32(textPort.Text), ssl);
                client.AuthenticationMechanisms.Remove("XOAUTH2");
                client.Authenticate(textUser.Text, textPassword.Text);

                if (client.Capabilities.HasFlag(Pop3Capabilities.UIDL))
                {
                    string uidsSupported = "";
                }

                var uids = client.GetMessageUids();

                for (int i = 0; i < client.Count; i++)
                {
                    if (backgroundWorker1.CancellationPending == true)
                    {
                        e.Cancel = true;
                        return;
                    }
                    string currentUidOnServer = uids[i];
                    if (!downloaded.Contains(uids[i]))
                    {
                        allMessages.Add(client.GetMessage(i));
                        downloaded.Add(uids[i]);
                        SaveFullMessage(client.GetMessage(i), i);
                        w = new StreamWriter(emailsIDSFile, true);
                        w.WriteLine(currentUidOnServer);
                        w.Close();
                        nProgress = (client.Count - i + 1) * 100 / client.Count;
                        backgroundWorker1.ReportProgress(nProgress, client.Count.ToString() + "/" + i);
                    }
                        nProgress = (client.Count - i + 1) * 100 / client.Count;
                        backgroundWorker1.ReportProgress(nProgress, client.Count.ToString() + "/" + i);
                }

                client.Disconnect(true);
            }
         }

And the exception is in the progresschanged event:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pbt.Value = e.ProgressPercentage;
            pbt.Text = e.ProgressPercentage.ToString() + "%";
            pbt.Invalidate();
            label8.Text = e.UserState.ToString();
            label8.Visible = true;
            ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[]
            {
              allMessages[countMsg].From.ToString(),
              allMessages[countMsg].Subject,
              allMessages[countMsg].Date.ToString() 
            }));
            countMsg += 1;
        }

The exception is on the part:

ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[]
                {
                  allMessages[countMsg].From.ToString(),
                  allMessages[countMsg].Subject,
                  allMessages[countMsg].Date.ToString() 
                }));

In this case allMessages and countMsg both have the value 1. So this is why it's throwing the exception but how should i solve it ?

Maybe this line:

countMsg += 1;

Should be in another place ? Maybe in the dowork event ?

Daniel Lipman
  • 41
  • 1
  • 8

1 Answers1

0

You shouldn't increment countMsg past the total number of items in allMessages, but you're not checking before incrementing. You could put the code within a for loop, looping the same number of times as there are elements in allMessages. Or you could check for null and stop if/when you get one

Jonathan
  • 4,916
  • 2
  • 20
  • 37