private int numberofallmessages = 0;
private int countMsg = 0;
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
OpenPop.Pop3.Pop3Client PopClient = new OpenPop.Pop3.Pop3Client();
PopClient.Connect("mail", 110, false);
PopClient.Authenticate("r", "n",
OpenPop.Pop3.AuthenticationMethod.UsernameAndPassword);
List<string> uids = PopClient.GetMessageUids();
int messageCount = PopClient.GetMessageCount();
numberofallmessages = messageCount;
allMessages = new List<OpenPop.Mime.Message>(messageCount);
for (int i = messageCount; i > 0; i--)
{
if (backgroundWorker1.CancellationPending == true)
{
e.Cancel = true;
return;
}
string currentUidOnServer = uids[i];
if (!seenUids.Contains(currentUidOnServer))
{
if (i > 0)
allMessages.Add(PopClient.GetMessage(i));
SaveFullMessage(PopClient.GetMessage(i), i);
w = new StreamWriter(emailsIDSFile, true);
w.WriteLine(i + " = " + currentUidOnServer);
w.Close();
int nProgress = (messageCount - i + 1) * 100 / messageCount;
backgroundWorker1.ReportProgress(nProgress, PopClient.GetMessageCount().ToString() + "/" + i);
}
}
PopClient.Disconnect();
}
问题在于:
string currentUidOnServer = uids[i];
uids包含7047项,也包含&#39; i&#39;现在是7047
我现在看到如果我改变了这条线:
int messageCount = PopClient.GetMessageCount();
要:
int messageCount = 30;
它工作正常。那么为什么当它的GetMessageCount()及它的7047而不是30它不起作用?
指数超出范围。必须是非负数且小于集合的大小。
答案 0 :(得分:5)
C#索引从零开始(0到N - 1)。因此,如果您有一个7047元素的集合,那么最后一项将是item[7046]
。尝试使用item[7047]
超出最后一个元素将导致您获得的错误。
查看您的代码,以下有两个问题:
for (int i = messageCount; i > 0; i--)
首先,初始元素将比集合中的最后一个元素高一个(这会导致您报告的错误)。
其次,永远不会到达集合中的最后(第一个)项,因为当最后一个(或第一个)元素为0时,此迭代将在元素1处停止。
将索引设置为30可以防止错误,因为显然集合中的最后一个索引不超过30。
答案 1 :(得分:1)
这是因为集合的可用索引从0变为Collection.Length-1。所以你应该将messageCount设置为
int messageCount = PopClient.GetMessageCount()-1;