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();
}
Run Code Online (Sandbox Code Playgroud)
问题在于:
string currentUidOnServer = uids[i];
Run Code Online (Sandbox Code Playgroud)
uids包含7047项,而且'i'现在在7047上
我现在看到如果我改变了这条线:
int messageCount = PopClient.GetMessageCount();
Run Code Online (Sandbox Code Playgroud)
至:
int messageCount = 30;
Run Code Online (Sandbox Code Playgroud)
它工作正常.那么为什么当它的GetMessageCount()和它的7047而不是30它不起作用?
指数超出范围.必须是非负数且小于集合的大小.
C#索引从零开始(0到N-1).所以如果你有一个7047元素的集合,那么最后一个项目就是item[7046].试图超越最后一个元素item[7047]将导致您获得的错误.
查看代码,以下有两个问题:
for (int i = messageCount; i > 0; i--)
Run Code Online (Sandbox Code Playgroud)
首先,初始元素将比集合中的最后一个元素高一个(这将导致您报告的错误).
其次,永远不会到达集合中的最后(第一个)项,因为当最后一个(或第一个)元素为0时,此迭代将在元素1处停止.
将索引设置为30可以防止错误,因为显然集合中的最后一个索引不超过30.
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |