下面有几个问题。一个是Resharper告诉我serverResponse值不能在任何执行路径中使用。另一个与获取每条消息的标题有关。如果我发出TOP 1 0
,它不会抛出任何错误,它就会挂起。如果我发出TOP 1 0
后跟Environment.NewLine,它会告诉我"-ERR no such message."
我从以下link获得了代码。
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);
}
}
}
答案 0 :(得分:1)
为什么要发送原始字节而不是文章中最初的文本?实际上,我实际上无法让您的代码进行编译,因为GetBytes
会返回byte[]
,但Write
需要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
将生成该消息。