Protobuf-net - 流不支持并发 IO 读取或写入操作

Posted

技术标签:

【中文标题】Protobuf-net - 流不支持并发 IO 读取或写入操作【英文标题】:Protobuf-net - The stream does not support concurrent IO read or write operations 【发布时间】:2015-03-22 15:57:47 【问题描述】:

我在 VB.Net(v2.0 框架)中有一个程序,在从 sql 数据阅读器执行 http post 时,我在几台机器上收到以下错误:

System.NotSupportedException: The stream does not support concurrent IO read or write operations.
   at System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
   at System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at ProtoBuf.ProtoWriter.Flush(ProtoWriter writer)
   at ProtoBuf.ProtoWriter.Dispose()
   at ProtoBuf.ProtoWriter.System.IDisposable.Dispose()
   at ProtoBuf.Meta.TypeModel.SerializeWithLengthPrefix(Stream dest, Object value, Type type, PrefixStyle style, Int32 fieldNumber, SerializationContext context)
   at ProtoBuf.Serializer.SerializeWithLengthPrefix[T](Stream destination, T instance, PrefixStyle style, Int32 fieldNumber)
   at ProtoBuf.Serializer.SerializeWithLengthPrefix[T](Stream destination, T instance, PrefixStyle style)

代码:

    postStream = request.GetRequestStream()
        While dr.Read()
           dd.Add(dr) ' Adding data row to proto
           ProtoBuf.Serializer.SerializeWithLengthPrefix(Of DataDump)(postStream, dd, ProtoBuf.PrefixStyle.Base128) ' stream proto to http post stream
           dd.Clear() ' Clear proto 
        End While
 response = DirectCast(request.GetResponse(), HttpWebResponse)

【问题讨论】:

【参考方案1】:

Protobuf-net 不发出并发读取或写入操作。由于您提到请求流,我预计实际问题与this question 有关。

【讨论】:

请看代码中的编辑。我只有在读取所有行并序列化到 postStream 后才做 getresponse。我还尝试了support.microsoft.com/kb/908573/en-us 的解决方案 还有一件事,在执行期间它开始占用大量内存并最终达到 1 GB(32 位)的上限并打印堆栈跟踪。它只发生在少数机器上,比如 5%。在其他机器上,没有问题。 @guarav 好吧,你序列化的是什么?它有多大?还有一些方法可以调整模型以帮助它使用仅转发机制,但不幸的是,“withlengthprefix”会引入问题;它在内部执行此操作的方式是序列化到内存缓冲区,然后写入大小,然后转储缓冲区。 我在 sqlserver 中运行查询,通过数据读取器获取结果,循环数据读取器并使用 protobuf-net 序列化每一行并将其发送到远程服务器的 http web 请求。结果的大小肯定很大。 proto模型是一个string类型的字典,string所以它就像一个列名和行值的键值对 实际上 proto 本身并不大,因为我正在为每一行创建新的 proto 并在发送到 poststream 后将其清除。基本上有数以百万计的 proto 流式传输到 httpwebrequest。你认为内存缓冲区仍然是个问题吗?【参考方案2】:

最后,这根本不是与 protbuf-net 相关的问题。即使将原型保存在二进制文件中然后尝试上传,它也会引发错误。 它可能是 httpwebrequest、.net 或 windows 补丁或 sophos 防病毒软件。 我正在结束这个问题,因为它已经不同了。 感谢您的所有帮助。

【讨论】:

以上是关于Protobuf-net - 流不支持并发 IO 读取或写入操作的主要内容,如果未能解决你的问题,请参考以下文章

保证IO流不出错

文件输入/输出流不工作

网页客户端上传错误

为啥 BufferedStream.Write 会抛出“此流不支持查找操作”?

java中输出流不关闭为啥不能写入

JAXL 异常:此流不支持 SSL/加密