0

下面有几个问题。一是 Resharper 告诉我 serverResponse 值不能用于任何执行路径。另一个与获取每条消息的标题有关。如果我发出 a TOP 1 0,它不会抛出任何错误,它只是挂在那里。如果我发出一个TOP 1 0后跟一个 Environment.NewLine,它告诉我"-ERR no such message." 我从以下链接获得了代码。

for (int i = 0; i <= messageCount; i++)
{
    _data = "TOP " + i + " 0";
    _sizeOfData = Encoding.ASCII.GetBytes(_data.ToCharArray());
    _networkStream.Write(_sizeOfData,0,_sizeOfData.Length);

    serverResponse = _streamReader.ReadLine();

    while (true)
    {
        serverResponse = _streamReader.ReadLine();

        if (serverResponse == ".") break;
        if (serverResponse.Length > 4)
        {
            if (serverResponse.Substring(0, 5) == "From:")
                lstMessages.Items.Add(serverResponse);
        }
    }
}
4

1 回答 1

1

为什么要发送原始字节而不是文章中最初的文本?实际上,我实际上无法编译您的代码,因为GetBytes返回 abyte[]Write需要 a char[]。我可以把它改成这个,至少它可以编译:

char[] _sizeOfData = Encoding.ASCII.GetChars(Encoding.ASCII.GetBytes(_data.ToCharArray()));

但所做的只是掩盖了一个您可能不会遇到的潜在问题,即非 ASCII 字符。(您的代码将导致出现非 ASCII 字符的问号,如果它们发生过会让您在调试时头疼,但在这种情况下绝不应该出现。)相反,您可以这样做:

char[] _sizeOfData = _data.ToCharArray();

无论如何,您的代码挂起的原因之一是因为文章中的代码正在使用WriteLine()它为您发送一个NewLine。因此,要么使用WriteLine()(推荐)或将您的字符串更改为:

string _data = "TOP " + i + " 0\n";

挂起的另一个原因是你没有在每一行之后冲洗:

_networkStream.Flush();

您可能会挂起的另一个原因是,如果您有大量消息并且您正在 UI 线程上处理所有这些消息。Console在您弄清楚网络部分之前,不要混合复杂性,输出到您可以实时监控的其他东西,然后添加您的对象/集合。

至于错误消息,在将您的代码片段插入该文章的主代码并修复我上面提到的内容后,我无法重现该错误。但是,如果您没有可用于 POP3 下载的消息,TOP 1 0则会生成该消息。

于 2011-09-02T20:35:32.163 回答