接收邮件超时 最近写了一个接收邮件的,使用retr获取邮件的时候,在读取网络流的时候老是超时之类的,执行下一条指令的时候老是报错,但是我用telnet下执行就一切正常。还有就是NetworkStream获取内容的速度真是慢,有没有好的解决方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是接收的过程没写好吧, 最初我在写通讯的时候也碰到过; 就是在使用NetworkStream.Read(buf,pos,size)的时候。 对的,我是使用ReadToEnd读取的,速度超慢 用这个方法试试, 它在接收大数据时会很耗内存,几M以下的应该是没问题的。List<Byte> bufList = new List<byte>();大量的数据应该输出到文件流,或其他设备中。不应该直接放到内存里。 private bool ReceiveStream(NetworkStream stream, ref byte[] origBuf, out byte[] outBuf) { outBuf = null; if (!stream.DataAvailable) { return false; } List<Byte> bufList = new List<byte>(); int total = 0; while (stream.DataAvailable) { int len = this.TryReceive(stream, origBuf, 0, m_BufSize); if (len <= 0) { break; } bufList.AddRange(origBuf); total += len; if (len < m_BufSize) { bufList.RemoveRange(total, m_BufSize - len); break; } } if (total == 0) { return false; } this.ReWaitingTimer(); outBuf = bufList.ToArray(); return true; } /// <summary> /// TryReceive /// </summary> /// <param name="stream"></param> /// <param name="origBuf"></param> /// <param name="outBuf"></param> /// <returns></returns> private int TryReceive(NetworkStream stream, byte[] buffer, int offset, int size) { //try //{ //} //catch (IOException) //{ //} //Array.Clear(buffer, offset, size); return stream.Read(buffer, offset, size); } 看了msdn这一段当需要从流的当前位置到末尾读取所有输入时,ReadToEnd 的性能最佳。如果需要对从流中读取的字符数进行进一步的控制,请使用 Read(Char[],Int32,Int32) 方法重载,它通常可达到更佳的性能。还是直接使用NetworkStream read比较快啊 ReadToEnd 好歹他没用使用到缓存。在读取少量数据时,说他性能最佳,我觉得是完全有道理。你想想如果是在读G级别的文件,ReadToEnd就绝对说不上好了(它肯定都是先读到你内存中)。此时,BufferedStream 类应该是接收数据的首选。Read方法每次读的数据块大小也会影响你的接收速度。不信可试试。 Read方法每次读的数据块大小也会影响你的接收速度 ,这个是肯定的了 单击鼠标选中数据 js的菜鸟问题,大侠进 C#写的exe如果需要远程路径调用需要什么条件? VC++ DLL方法返回值为结构体类型用C#如何调用? 小女跪求:C#提取.txt文档的问题!急~~在线等待! 为什么读取不了父结点下的子结点??? 未将对象引用设置到对象的实例 ^^^数组保存TextBox的问题^^^^ ++++100分++++ Winform 的工具条问题 oralce问题,请高手指教(等待) C#中保存图片到数据库 如何在DataGrid中绑定两排同样的数据?
List<Byte> bufList = new List<byte>();大量的数据应该输出到文件流,或其他设备中。不应该直接放到内存里。
private bool ReceiveStream(NetworkStream stream, ref byte[] origBuf, out byte[] outBuf)
{
outBuf = null; if (!stream.DataAvailable)
{
return false;
} List<Byte> bufList = new List<byte>();
int total = 0;
while (stream.DataAvailable)
{
int len = this.TryReceive(stream, origBuf, 0, m_BufSize);
if (len <= 0)
{
break;
} bufList.AddRange(origBuf);
total += len;
if (len < m_BufSize)
{
bufList.RemoveRange(total, m_BufSize - len);
break;
}
} if (total == 0)
{
return false;
} this.ReWaitingTimer(); outBuf = bufList.ToArray();
return true;
}
/// <summary>
/// TryReceive
/// </summary>
/// <param name="stream"></param>
/// <param name="origBuf"></param>
/// <param name="outBuf"></param>
/// <returns></returns>
private int TryReceive(NetworkStream stream, byte[] buffer, int offset, int size)
{
//try
//{
//}
//catch (IOException)
//{
//} //Array.Clear(buffer, offset, size);
return stream.Read(buffer, offset, size);
}
当需要从流的当前位置到末尾读取所有输入时,ReadToEnd 的性能最佳。如果需要对从流中读取的字符数进行进一步的控制,请使用 Read(Char[],Int32,Int32) 方法重载,它通常可达到更佳的性能。还是直接使用NetworkStream read比较快啊
在读取少量数据时,说他性能最佳,我觉得是完全有道理。你想想如果是在读G级别的文件,ReadToEnd就绝对说不上好了(它肯定都是先读到你内存中)。此时,BufferedStream 类应该是接收数据的首选。Read方法每次读的数据块大小也会影响你的接收速度。不信可试试。