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

Zap*_*ica 5 c# asynchronous memory-management 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
Run Code Online (Sandbox Code Playgroud)

这是在〜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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我是否正确使用了开始发送?

我有一件事是,它是异步的,我的程序可能循环遍历整个队列并将其全部卸载到异步系统缓冲区吗?

{编辑}

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

我排干队列的方式

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)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 1

对于每个队列项目,您发出异步发送。这意味着无限数量的发送操作可能处于待处理状态。资源使用不受限制。通常,您会发出一次发送,并且仅在上一次发送完成后才发出下一次发送。

对于异步 IO,这并不是那么容易做到的。要么改用await(这又会变成一个简单的问题),要么只使用同步IO。

  • 是的。_____________________________ (2认同)