Quellcode durchsuchen

解决内存不自动清理的问题

lith vor 4 Jahren
Ursprung
Commit
267d00fa93
17 geänderte Dateien mit 88 neuen und 33 gelöschten Zeilen
  1. 2 3
      dotnet/Library/Sers/Sers.CL/Ipc/Sers.CL.Ipc.NamedPipe/DeliveryConnection.cs
  2. 7 1
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Base/DeliveryClient_Base.cs
  3. 9 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Base/DeliveryServer_Base.cs
  4. 0 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Simple/DeliveryClient.cs
  5. 0 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Simple/DeliveryServer.cs
  6. 0 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/SpinWait/DeliveryClient.cs
  7. 0 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/SpinWait/DeliveryServer.cs
  8. 0 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Timer/DeliveryClient.cs
  9. 0 2
      dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Timer/DeliveryServer.cs
  10. 3 1
      dotnet/Library/Sers/Sers.CL/Test/CommunicationManage/CmClient/ProgramQps.cs
  11. 3 1
      dotnet/Library/Sers/Sers.CL/Test/CommunicationManage/CmServer/Program.cs
  12. 6 4
      dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/Program.cs
  13. 5 3
      dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryServer/Program.cs
  14. 35 1
      dotnet/Library/Sers/Sers.Core/Sers.Core/Module/App/SersApplication.cs
  15. 6 0
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pipelines/PipeFrame.cs
  16. 1 1
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/DataPool.cs
  17. 11 4
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Threading/LongTaskHelp_TimeLimit.cs

+ 2 - 3
dotnet/Library/Sers/Sers.CL/Ipc/Sers.CL.Ipc.NamedPipe/DeliveryConnection.cs

@@ -77,8 +77,7 @@ namespace Sers.CL.Ipc.NamedPipe
             {
                 stream.Close();
                 stream.Dispose();
-
-                //stream.Shutdown(SocketShutdown.Both);
+ 
             }
             catch (Exception ex)
             {
@@ -138,7 +137,7 @@ namespace Sers.CL.Ipc.NamedPipe
                     //异步读取
                     if (stream.IsConnected)
                     {
-                        var result=stream.BeginRead(buffer, 0, receiveBufferSize, new AsyncCallback(AsyncReadCallback), asyncState);                  
+                        var result = stream.BeginRead(buffer, 0, receiveBufferSize, new AsyncCallback(AsyncReadCallback), asyncState);
                         return;
                     }
                 }

+ 7 - 1
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Base/DeliveryClient_Base.cs

@@ -5,6 +5,7 @@ using System.Net;
 using System.Net.Sockets;
 using System.Runtime.CompilerServices;
 using System.Threading;
+using System.Threading.Tasks;
 using Sers.Core.CL.MessageDelivery;
 using Vit.Core.Module.Log;
 using Vit.Core.Util.Net;
@@ -200,7 +201,12 @@ namespace Sers.CL.Socket.Iocp.Base
 
                     // start loop
                     if (!socket.ReceiveAsync(e))
-                        ProcessReceive(e);
+                    {
+                        Task.Run(() =>
+                        {
+                            ProcessReceive(e);
+                        });
+                    }           
                     return;
                 }
             }

+ 9 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Base/DeliveryServer_Base.cs

@@ -8,6 +8,7 @@ using System.Net;
 using System.Net.Sockets;
 using System.Runtime.CompilerServices;
 using System.Threading;
+using System.Threading.Tasks;
 using Sers.Core.CL.MessageDelivery;
 using Vit.Core.Module.Log;
 using Vit.Core.Util.Net;
@@ -274,7 +275,6 @@ namespace Sers.CL.Socket.Iocp.Base
             DeliveryConnection conn = e.UserToken as DeliveryConnection;
             if (conn == null) return;
 
-
             try
             {
 
@@ -287,10 +287,17 @@ namespace Sers.CL.Socket.Iocp.Base
                     byte[] buffData = DataPool.BytesGet(receiveBufferSize);
                     e.SetBuffer(buffData, 0, buffData.Length);
 
+
+
                     // start loop
                     //继续接收. 为什么要这么写,请看Socket.ReceiveAsync方法的说明
                     if (!conn.socket.ReceiveAsync(e))
-                        ProcessReceive(e);
+                    {
+                        Task.Run(() =>
+                        {
+                            ProcessReceive(e);
+                        });
+                    }
                     return;
                 }
             }

+ 0 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Simple/DeliveryClient.cs

@@ -1,5 +1,3 @@
-// https://freshflower.iteye.com/blog/2285286
-
 using System;
 using Sers.CL.Socket.Iocp.Base;
 using Vit.Core.Module.Log;

+ 0 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Simple/DeliveryServer.cs

@@ -1,5 +1,3 @@
-//  https://freshflower.iteye.com/blog/2285272 
-
 using System;
 using Sers.CL.Socket.Iocp.Base;
 using Vit.Core.Module.Log;

+ 0 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/SpinWait/DeliveryClient.cs

@@ -1,5 +1,3 @@
-// https://freshflower.iteye.com/blog/2285286
-
 using System;
 using System.Runtime.CompilerServices;
 using System.Threading;

+ 0 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/SpinWait/DeliveryServer.cs

@@ -1,5 +1,3 @@
-//  https://freshflower.iteye.com/blog/2285272 
-
 using System;
 using System.Runtime.CompilerServices;
 using System.Threading;

+ 0 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Timer/DeliveryClient.cs

@@ -1,5 +1,3 @@
-// https://freshflower.iteye.com/blog/2285286
-
 using System;
 using System.Runtime.CompilerServices;
 using Sers.CL.Socket.Iocp.Base;

+ 0 - 2
dotnet/Library/Sers/Sers.CL/Socket/Sers.CL.Socket.Iocp/Mode/Timer/DeliveryServer.cs

@@ -1,5 +1,3 @@
-//  https://freshflower.iteye.com/blog/2285272 
-
 using System;
 using System.Runtime.CompilerServices;
 using Sers.CL.Socket.Iocp.Base;

+ 3 - 1
dotnet/Library/Sers/Sers.CL/Test/CommunicationManage/CmClient/ProgramQps.cs

@@ -26,8 +26,10 @@ namespace CLClient
                 StartThreadSendMessage();
             }
 
+            Sers.Core.Module.App.SersApplication.OnStart();
+
             while (true)
-            { 
+            {              
                 Thread.Sleep(5000);
             }
 

+ 3 - 1
dotnet/Library/Sers/Sers.CL/Test/CommunicationManage/CmServer/Program.cs

@@ -49,8 +49,10 @@ namespace CLServer
 
             cm.Start();
 
+            Sers.Core.Module.App.SersApplication.OnStart();
+
             while (true)
-            {                 
+            {
                 Thread.Sleep(5000);
             }
 

+ 6 - 4
dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/Program.cs

@@ -70,7 +70,7 @@ namespace DeliveryTest
         static int port = 4501;
 
         static int thread = 1;
-        static int msgLen = 1;
+        static int msgLen = 1000_000_000;
 
 
 
@@ -78,7 +78,7 @@ namespace DeliveryTest
 
         static void StartClient()
         {
-            var client = new Sers.CL.Socket.Iocp.Mode.Timer.DeliveryClient();
+            //var client = new Sers.CL.Socket.Iocp.Mode.Timer.DeliveryClient();
             //var client = new Sers.CL.Socket.ThreadWait.DeliveryClient();
 
             //client.host = host;
@@ -86,9 +86,11 @@ namespace DeliveryTest
 
             //var client = new Sers.CL.WebSocket.DeliveryClient();
             //var client = new Sers.CL.ClrZmq.ThreadWait.DeliveryClient();
-            //var client = new Sers.CL.Ipc.SharedMemory.DeliveryClient();
+
             //var client = new Sers.CL.Zmq.FullDuplex.DeliveryClient();
-            //var client = new Sers.CL.Ipc.NamedPipe.DeliveryClient();
+
+            //var client = new Sers.CL.Ipc.SharedMemory.DeliveryClient();
+            var client = new Sers.CL.Ipc.NamedPipe.DeliveryClient();
 
             client.Conn_OnGetFrame = (conn, data) =>
            {

+ 5 - 3
dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryServer/Program.cs

@@ -43,17 +43,19 @@ namespace DeliveryTest
 
         static void StartServer()
         {
-            var server = new Sers.CL.Socket.Iocp.Mode.Timer.DeliveryServer();
+            //var server = new Sers.CL.Socket.Iocp.Mode.Timer.DeliveryServer();
             //var server = new Sers.CL.Socket.ThreadWait.DeliveryServer();
             // server.port = port;
 
             //var server = new Sers.CL.WebSocket.DeliveryServer();
             //var server = new Sers.CL.ClrZmq.ThreadWait.DeliveryServer();
-            //var server = new Sers.CL.Ipc.SharedMemory.DeliveryServer();        
+
 
 
             //var server = new Sers.CL.Zmq.FullDuplex.DeliveryServer();
-            //var server = new Sers.CL.Ipc.NamedPipe.DeliveryServer();
+
+            //var server = new Sers.CL.Ipc.SharedMemory.DeliveryServer();     
+            var server = new Sers.CL.Ipc.NamedPipe.DeliveryServer();
 
             server.Conn_OnConnected = (conn) =>
             {

+ 35 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/App/SersApplication.cs

@@ -4,6 +4,7 @@ using Vit.Core.Util.ConfigurationManager;
 using System;
 using System.Threading;
 using Sers.Hardware.Env;
+using Vit.Core.Util.Threading;
 
 namespace Sers.Core.Module.App
 {
@@ -20,9 +21,23 @@ namespace Sers.Core.Module.App
         #endregion
 
 
+
+        #region timer for   System.GC.Collect();
+        static SersTimer gcTimer = new SersTimer()
+        {
+            intervalMs = 10000,
+            timerCallback = (e) =>
+              {
+                  System.GC.Collect();
+              }
+        };
+        #endregion
+
+
         #region Start
         public static void OnStart()
-        {
+        {    
+
             IsRunning = true;
             try
             {
@@ -33,12 +48,31 @@ namespace Sers.Core.Module.App
             {
                 Logger.Error(ex);
             }
+
+            try
+            {
+                gcTimer.Start();
+            }
+            catch (Exception ex)
+            {
+                Logger.Error(ex);
+            }
         }
         #endregion
 
 
         public static void OnStop()
         {
+            try
+            {
+                gcTimer.Stop();
+            }
+            catch (Exception ex)
+            {
+                Logger.Error(ex);
+            }
+          
+
             IsRunning = false;
 
             try

+ 6 - 0
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pipelines/PipeFrame.cs

@@ -21,6 +21,12 @@ namespace Vit.Core.Util.Pipelines
         int QueueBuff_dataLenOfRemoved = 0;
 
 
+        public void Clear() 
+        {
+            queueBuff.Clear();
+        }
+
+
         public Action<ArraySegment<byte>> OnDequeueData;
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 1 - 1
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/DataPool.cs

@@ -20,7 +20,7 @@ namespace Vit.Core.Util.Pool
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static void BytesReturn(byte[] data)
         {
-             ArrayPool<byte>.Shared.Return(data);
+            ArrayPool<byte>.Shared.Return(data);
         }
         #endregion
 

+ 11 - 4
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Threading/LongTaskHelp_TimeLimit.cs

@@ -259,9 +259,9 @@ namespace Vit.Core.Util.Threading
                             //(x.x.4)
                             OnFinish(this);
                         }
-                        catch (Exception ex) when (ex.GetBaseException() is ThreadInterruptedException)                   
+                        catch (Exception ex) when (ex.GetBaseException() is ThreadInterruptedException)
                         {
-                           
+
                             try
                             {
                                 isDealing = false;
@@ -269,12 +269,12 @@ namespace Vit.Core.Util.Threading
                             }
                             catch (Exception ex1)
                             {
-                                Logger.Error(ex1);                              
+                                Logger.Error(ex1);
                                 if (task.stopWhenException)
                                 {
                                     return;
                                 }
-                            }                            
+                            }
                         }
                         catch (Exception ex)
                         {
@@ -285,6 +285,13 @@ namespace Vit.Core.Util.Threading
                                 return;
                             }
                         }
+                        finally 
+                        {
+                            workArg = null;                           
+                            workArg2 = null;
+                            workArg3 = null;
+                            workArg4 = null;
+                        }
 
                     } while (task.loop);
                 }