内存问题与异步套接字并开始发送

时间:2014-07-17 12:27:05

标签: c# memory-management asynchronous asyncsocket

我注意到今天我正在开发的一个应用程序在内存中严重增长。 所以我做了一个Visual Studio内存配置文件,我发现了以下结果:

 Function Name  Inclusive Allocations   Exclusive Allocations   Inclusive Bytes Exclusive Bytes
 System.Net.Sockets.Socket.BeginSend(uint8[],int32,int32,valuetype System.Net.Sockets.SocketFlags,valuetype System.Net.Sockets.SocketError&,class System.AsyncCallback,object)  3 192 569   3 192 561   635 307 885 635 307 621

这是在〜600Meg

的内存使用量之上

这对我来说似乎不对,我不确定为什么会这样?

这是我的发送功能:

private void SendSignal(Byte[] signal)
    {
        if (state.WorkSocket.Connected)
        {
            try
            {
                state.WorkSocket.BeginSend(signal, 0, signal.Length, 0, new AsyncCallback(SendCallback), state.WorkSocket);
            }
            catch (Exception e)
            {                    
                log.Error("Transmission Failier for ip: " + state.WorkSocket.AddressFamily , e);
            }
        }
        else
        {
            CloseConnection();
        }
    }

应用程序阻塞并发QUEUE并发送消息,当它成功出列消息时,它会遍历所有已注册的(客户端)并将此消息发送给它们。

我是否正确使用了begin-send?

我要做的一件事是,它是异步的,我的程序是否可以遍历整个队列并将其全部卸载到异步系统缓冲区中?

{编辑}

private void SendCallback(IAsyncResult asyncResult)
    {
        try
        {
            Socket handler = (Socket)asyncResult.AsyncState;
            int bytesSent = handler.EndSend(asyncResult);
            if (bytesSent == 0)
            {
                CloseConnection();
                return;
            }
        }
        catch
        {
            CloseConnection();
        }
    }

我排空队列的方式

ExponentialBackoff eb = new ExponentialBackoff();
        while (run)
        {
            //Fetch Latest Item
            ILogItem logItem;
            if (incomingQueue.TryDequeue(out logItem))
            {
                //Handle the logItem
                SendEventToObservers(logItem);
                //Reset the exponetial backoff counter
                eb.reset();
            }
            else
            {
                //Exponential backoff thread sleep
                eb.sleep();
            }
        }

private void SendEventToObservers(ILogItem item)
    {
        foreach (var observer in registeredObservers.ToList())
        {
            if (observer != null)
            {
                observer.OnMessageRecieveEvent(new ObserverEvent(item));
                // This just calls private void SendSignal(Byte[] signal)
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

对于每个队列项,您发出异步发送。这意味着无限数量的发送操作可能正在等待处理。资源使用是无限的。通常,您发出一个发送,并且只在上一个发送完成后发出下一个发送。

使用异步IO,这并不容易。切换到使用await(将其变回一个简单的问题)或只使用同步IO。