0

我正在从 Windows phone 8 中的流套接字中递归读取数据。它运行良好,但存在内存泄漏。即每次读取后内存大小都会增加。谁能告诉我这有什么问题?这是我的实现

public async Task ReadSocket(StreamSocket Socket)
{            
    try
    {
        uint intBytesRead;
        var dataReader = new DataReader(Socket.InputStream);
        dataReader.InputStreamOptions = InputStreamOptions.Partial;
        intBytesRead = await dataReader.LoadAsync(4);                
        if (intBytesRead == 0)
        {
            OnDisconnect(Socket);
            return;
        }

        while (intBytesRead < 4)
        {
            uint read = await dataReader.LoadAsync((uint)4 - intBytesRead);
            if (read == 0)
            {
                OnDisconnect(Socket);
                return;
            }
            intBytesRead += read;
        }

        byte[] data = new byte[4];
        dataReader.ReadBytes(data);

        int lenHTN = BitConverter.ToInt32(data, 0);

        int length = CommonUtil.ConvertNToH(lenHTN);                

        if (length < 1)
        {
            OnDisconnect(Socket);
            return;
        }

        data = new byte[length];

        uint dataBytesRead = await dataReader.LoadAsync((uint)length);                

        if (dataBytesRead == 0)
        {
            OnDisconnect(Socket);
            return;
        }

        while (dataBytesRead < length)
        {
            uint read = await dataReader.LoadAsync((uint)length - dataBytesRead);
            if (read == 0)
            {
                OnDisconnect(Socket);
                return;
            }
            dataBytesRead += read;
        }

        dataReader.ReadBytes(data);

        Debug.WriteLine("Check Memory Status");

    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
        if (SocketError.GetStatus(ex.HResult) == SocketErrorStatus.ConnectionResetByPeer)
        {
            OnDisconnect(Socket);
            return;
        }
    }          
await ReadSocket(Socket);

}

这是输出

Check Memory Status

当前:25MB 限制:314MB
检查内存状态 当前:25MB 限制:314MB
检查内存状态 当前:25MB 限制:314MB
检查内存状态 当前:25MB 限制:314MB
检查内存状态 当前:26MB 限制:314MB
检查内存状态 当前:26MB 限制: 314MB
检查内存状态当前:27MB 限制:314MB
检查内存状态当前:27MB 限制:314MB
检查内存状态当前:27MB 限制:314MB
。. .
检查内存状态当前:72MB 限制:314MB
检查内存状态当前:72MB 限制:314MB
。. 由于内存不足,它会一直持续到应用程序崩溃。

4

1 回答 1

0

内存泄漏是由递归引起的。在内存方面,async方法的行为与普通同步方法几乎相同,只是它们的局部变量存储在堆上。

因此,对于您的代码,方法中的内存data、其他变量以及Task来自先前迭代的一些附加信息(如从方法返回的信息)永远不会被释放,这会导致您的泄漏。

如果您data = null;在 recursive 之前添加await,那可能会显着改善情况,但不会修复泄漏。

为此,您需要将代码从递归更改为正常循环。就像是:

bool finished = false;
while (!finished)
{
    finished = await ReadSingleSocket(socket);
}

WhereReadSingleSocket()是一个包含大部分代码的方法ReadSocket(),除了递归await。它会true在阅读停止时返回,false否则返回。

于 2013-09-10T16:41:44.433 回答