【问题标题】:Protobuf-net - The stream does not support concurrent IO read or write operationsProtobuf-net - 流不支持并发 IO 读取或写入操作
【发布时间】: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)

【问题讨论】:

    标签: vb.net memory httpwebrequest http-post protobuf-net


    【解决方案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 防病毒软件。 我正在结束这个问题,因为它已经不同了。 感谢您的所有帮助。

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 1970-01-01
      • 2011-06-01
      • 2013-10-20
      • 2017-03-24
      • 2016-04-26
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多