Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 套接字数据传输-内存不足异常_Sockets_Windows Phone 8_Out Of Memory - Fatal编程技术网

Sockets 套接字数据传输-内存不足异常

Sockets 套接字数据传输-内存不足异常,sockets,windows-phone-8,out-of-memory,Sockets,Windows Phone 8,Out Of Memory,我正在使用TCP套接字从pc向手机发送每台约10 Mbs的文件。 在电话端,我接收到如下数据: Dim B As Byte() = New Byte(Socket.ReceiveBufferSize - 1) {} Me.Args.SetBuffer(B, 0, Socket.ReceiveBufferSize) Me.Socket.ReceiveAsync(Me.Args) ReceiveBufferSize属性设置为30000000。 我是这样读的: Dim R As Byt

我正在使用TCP套接字从pc向手机发送每台约10 Mbs的文件。 在电话端,我接收到如下数据:

  Dim B As Byte() = New Byte(Socket.ReceiveBufferSize - 1) {}
  Me.Args.SetBuffer(B, 0, Socket.ReceiveBufferSize)
  Me.Socket.ReceiveAsync(Me.Args)
ReceiveBufferSize属性设置为30000000。 我是这样读的:

 Dim R As Byte() = New Byte(Me.Args.BytesTransferred - 1) {}
 Dim s As New MemoryStream(Me.Args.Buffer)
 Me.Args.SetBuffer(0, 0)

 s.Read(R, 0, ntpData.Length)
 s.Dispose()
这个过程占用了大量内存(约300MB),因此我无法在内存使用限制为180MB的低价设备上运行该应用程序。 我无法
.Dispose()
每次手机接收到某个内容时都打开插座,因为它会引发OjbectDisposed异常。
我怎样才能释放内存?

听起来这个问题可能被解决了。你怎么能用更少的内存?例如,您可以:

  • 从套接字下载小块数据,并重用相同的缓冲区,而不是重新分配它
  • 将数据写入一个独立的存储流,而不是内存,并且只将在给定时间点需要在应用程序中显示的内容加载到memroy中
(这取决于您工作的具体场景)

您还应该确保已经分配的内存在使用完毕后被垃圾回收,方法是确保没有任何内存包含对它的引用


此外,您是否对应用程序进行了分析,以确认问题是由该套接字内存引起的,还是由其他内存引起的?

您很幸运,因为您在开发阶段内存不足

永远不要在windows Phone上使用大于84KB的缓冲区(字节数组),GC不会收集大于84KB的字节数组中的数据

您的代码应类似于:

Try
            stream.Position = 0
            Dim totalRead As Long = 0
            Dim readBuffer As Integer
            Dim bufferSize As Long = 4096 'under 86KB
            Dim readArray = New Byte(bufferSize - 1) {}
            While totalRead < stream.Length
                readBuffer = Await stream.ReadAsync(readArray, 0, bufferSize)
                totalRead += readBuffer
                'Use readArray here
            End While
            stream.Dispose()
        Catch ex As Exception
            'Log My exception
        Finally
            stream.Dispose()
        End Try
试试看
stream.Position=0
Dim TOTALL读取长度=0
将读取缓冲区设置为整数
长=4096'且小于86KB时变暗缓冲区大小
Dim readArray=新字节(缓冲大小-1){
而totalRead
只要试着像这样修改代码,内存就不会超过50MB


祝你好运。

因为我找不到解决问题的真正办法,所以我设法用变通办法解决了这个问题

每个数据包都有一个报头。
在发送大量数据之前,我向客户端发送一个具有不同头的数据包。然后,客户机识别出这种类型的头并读取头旁边的字节:它们包含下一个流的长度。因此,客户端设置缓冲区长度并等待数据的到来。

我在应用程序中“注释”了其他过程,是的,我非常确定这就是问题所在。不过,我会尝试第一种解决方案,如果还不够,我也会尝试第二种。感谢在UI中显示大量图像是内存使用率高的常见原因,所以请注意。当然,但我不会显示任何图像。问题是ReceiveBufferSize太大了,但无法理解如何在块中执行ReceiveAsync。这对我的情况没有帮助,事实上,在处理流之前我不知道流的长度。我所能做的就是设置一个缓冲区,将流放入其中,如上面代码所示。