From 5787ee79171ebdddb8353be6b8acde82915bf6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E7=88=B1=E8=8B=B9=E6=9E=9CC?= <842352715@qq.com> Date: Mon, 23 Dec 2019 15:13:39 +0800 Subject: [PATCH 1/3] =?UTF-8?q?Demo.TcpServer-TestEcho=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=B8=ADThreadPool=E6=94=B9=E7=94=A8AsyncQueue=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=BC=82=E6=AD=A5=E5=A4=84=E7=90=86=E8=80=97=E6=97=B6?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/Demo.sln | 534 +++++++++--------- .../TextDataReceiveAdapter.cs | 2 +- .../Program-Terminator.cs | 2 +- .../AsyncQueue/AsyncQueue.cs | 71 +++ demo/TcpServer-TestEcho/AsyncQueue/Worker.cs | 56 ++ demo/TcpServer-TestEcho/FormServer.cs | 91 ++- .../TcpServer-TestEcho.csproj | 306 +++++----- 7 files changed, 615 insertions(+), 447 deletions(-) create mode 100644 demo/TcpServer-TestEcho/AsyncQueue/AsyncQueue.cs create mode 100644 demo/TcpServer-TestEcho/AsyncQueue/Worker.cs diff --git a/demo/Demo.sln b/demo/Demo.sln index 844b716..fd42bb5 100644 --- a/demo/Demo.sln +++ b/demo/Demo.sln @@ -1,267 +1,267 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29326.143 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpClient-TestEcho", "TcpClient-TestEcho\TcpClient-TestEcho.csproj", "{C76C5BFC-6741-464D-8C19-1B526F546627}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Models", "Models\Models.csproj", "{EFF012B0-9AF5-46A7-BF05-C1DE109E4785}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPullServer-TestEcho", "TcpPullServer-TestEcho\TcpPullServer-TestEcho.csproj", "{72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPullClient-TestEcho", "TcpPullClient-TestEcho\TcpPullClient-TestEcho.csproj", "{C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPackServer-TestEcho", "TcpPackServer-TestEcho\TcpPackServer-TestEcho.csproj", "{6A4AE1C7-C545-4020-AB44-905D2889D031}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPackClient-TestEcho", "TcpPackClient-TestEcho\TcpPackClient-TestEcho.csproj", "{F4EDF210-CAB7-412D-B001-F4F210E88C0C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPackAgent-TestEcho", "TcpPackAgent-TestEcho\TcpPackAgent-TestEcho.csproj", "{2AB65132-8A20-4016-9BA3-9996DC0B3F33}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPullAgent-TestEcho", "TcpPullAgent-TestEcho\TcpPullAgent-TestEcho.csproj", "{79952989-BB34-47DE-86E1-912225656F75}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpAgent-TestEcho", "TcpAgent-TestEcho\TcpAgent-TestEcho.csproj", "{23376F16-1967-45F7-8E52-4F5A36B94062}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SslAgent-TestEcho", "SslAgent-TestEcho\SslAgent-TestEcho.csproj", "{DE048EE0-40DB-4D11-A216-DA676F458699}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SslClient-TestEcho", "SslClient-TestEcho\SslClient-TestEcho.csproj", "{6F52CBB9-A48F-46D7-8E5E-F631C4E15874}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SslServer-TestEcho", "SslServer-TestEcho\SslServer-TestEcho.csproj", "{B59D79CC-DD24-46AD-BCE5-A2FF802C8336}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSocketServer-TestEcho", "netcoreapp\WebSocketServer-TestEcho\WebSocketServer-TestEcho.csproj", "{D4D997F5-854E-4B1F-8B08-7983F320032F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSocketClient-TestEcho", "netcoreapp\WebSocketClient-TestEcho\WebSocketClient-TestEcho.csproj", "{61E0D926-BC61-489F-A6FA-E9EEDD486812}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPortForwarding", "TcpPortForwarding\TcpPortForwarding.csproj", "{3EEE8931-3B36-409F-9FA5-6A31AE08BB51}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "netcoreapp", "netcoreapp", "{3967FFF0-ED1D-40D0-A169-D04239AA60BC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpServer-TestEcho", "TcpServer-TestEcho\TcpServer-TestEcho.csproj", "{5BC55483-F140-4C87-B6DD-ECA268DEBD9C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpServer-TestEcho-Adapter", "TcpServer-TestEcho-Adapter\TcpServer-TestEcho-Adapter.csproj", "{BB5B3E95-69CF-4867-8C0E-C989525342DA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x64.ActiveCfg = Debug|x64 - {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x64.Build.0 = Debug|x64 - {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x86.ActiveCfg = Debug|x86 - {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x86.Build.0 = Debug|x86 - {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|Any CPU.Build.0 = Release|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x64.ActiveCfg = Release|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x64.Build.0 = Release|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x86.ActiveCfg = Release|Any CPU - {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x86.Build.0 = Release|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x64.ActiveCfg = Debug|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x64.Build.0 = Debug|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x86.ActiveCfg = Debug|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x86.Build.0 = Debug|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|Any CPU.Build.0 = Release|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x64.ActiveCfg = Release|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x64.Build.0 = Release|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x86.ActiveCfg = Release|Any CPU - {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x86.Build.0 = Release|Any CPU - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x64.ActiveCfg = Debug|x64 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x64.Build.0 = Debug|x64 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x86.ActiveCfg = Debug|x86 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x86.Build.0 = Debug|x86 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|Any CPU.Build.0 = Release|Any CPU - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x64.ActiveCfg = Release|x64 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x64.Build.0 = Release|x64 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x86.ActiveCfg = Release|x86 - {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x86.Build.0 = Release|x86 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x64.ActiveCfg = Debug|x64 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x64.Build.0 = Debug|x64 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x86.ActiveCfg = Debug|x86 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x86.Build.0 = Debug|x86 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|Any CPU.Build.0 = Release|Any CPU - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x64.ActiveCfg = Release|x64 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x64.Build.0 = Release|x64 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x86.ActiveCfg = Release|x86 - {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x86.Build.0 = Release|x86 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x64.ActiveCfg = Debug|x64 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x64.Build.0 = Debug|x64 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x86.ActiveCfg = Debug|x86 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x86.Build.0 = Debug|x86 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|Any CPU.Build.0 = Release|Any CPU - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x64.ActiveCfg = Release|x64 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x64.Build.0 = Release|x64 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x86.ActiveCfg = Release|x86 - {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x86.Build.0 = Release|x86 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x64.ActiveCfg = Debug|x64 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x64.Build.0 = Debug|x64 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x86.ActiveCfg = Debug|x86 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x86.Build.0 = Debug|x86 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|Any CPU.Build.0 = Release|Any CPU - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x64.ActiveCfg = Release|x64 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x64.Build.0 = Release|x64 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x86.ActiveCfg = Release|x86 - {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x86.Build.0 = Release|x86 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x64.ActiveCfg = Debug|x64 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x64.Build.0 = Debug|x64 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x86.ActiveCfg = Debug|x86 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x86.Build.0 = Debug|x86 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|Any CPU.Build.0 = Release|Any CPU - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x64.ActiveCfg = Release|x64 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x64.Build.0 = Release|x64 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x86.ActiveCfg = Release|x86 - {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x86.Build.0 = Release|x86 - {79952989-BB34-47DE-86E1-912225656F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {79952989-BB34-47DE-86E1-912225656F75}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79952989-BB34-47DE-86E1-912225656F75}.Debug|x64.ActiveCfg = Debug|x64 - {79952989-BB34-47DE-86E1-912225656F75}.Debug|x64.Build.0 = Debug|x64 - {79952989-BB34-47DE-86E1-912225656F75}.Debug|x86.ActiveCfg = Debug|x86 - {79952989-BB34-47DE-86E1-912225656F75}.Debug|x86.Build.0 = Debug|x86 - {79952989-BB34-47DE-86E1-912225656F75}.Release|Any CPU.ActiveCfg = Release|Any CPU - {79952989-BB34-47DE-86E1-912225656F75}.Release|Any CPU.Build.0 = Release|Any CPU - {79952989-BB34-47DE-86E1-912225656F75}.Release|x64.ActiveCfg = Release|x64 - {79952989-BB34-47DE-86E1-912225656F75}.Release|x64.Build.0 = Release|x64 - {79952989-BB34-47DE-86E1-912225656F75}.Release|x86.ActiveCfg = Release|x86 - {79952989-BB34-47DE-86E1-912225656F75}.Release|x86.Build.0 = Release|x86 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x64.ActiveCfg = Debug|x64 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x64.Build.0 = Debug|x64 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x86.ActiveCfg = Debug|x86 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x86.Build.0 = Debug|x86 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|Any CPU.Build.0 = Release|Any CPU - {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x64.ActiveCfg = Release|x64 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x64.Build.0 = Release|x64 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x86.ActiveCfg = Release|x86 - {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x86.Build.0 = Release|x86 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x64.ActiveCfg = Debug|x64 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x64.Build.0 = Debug|x64 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x86.ActiveCfg = Debug|x86 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x86.Build.0 = Debug|x86 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|Any CPU.Build.0 = Release|Any CPU - {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x64.ActiveCfg = Release|x64 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x64.Build.0 = Release|x64 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x86.ActiveCfg = Release|x86 - {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x86.Build.0 = Release|x86 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x64.ActiveCfg = Debug|x64 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x64.Build.0 = Debug|x64 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x86.ActiveCfg = Debug|x86 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x86.Build.0 = Debug|x86 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|Any CPU.Build.0 = Release|Any CPU - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x64.ActiveCfg = Release|x64 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x64.Build.0 = Release|x64 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x86.ActiveCfg = Release|x86 - {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x86.Build.0 = Release|x86 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x64.ActiveCfg = Debug|x64 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x64.Build.0 = Debug|x64 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x86.ActiveCfg = Debug|x86 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x86.Build.0 = Debug|x86 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|Any CPU.Build.0 = Release|Any CPU - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x64.ActiveCfg = Release|x64 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x64.Build.0 = Release|x64 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x86.ActiveCfg = Release|x86 - {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x86.Build.0 = Release|x86 - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x64.ActiveCfg = Debug|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x64.Build.0 = Debug|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x86.ActiveCfg = Debug|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x86.Build.0 = Debug|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|Any CPU.Build.0 = Release|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x64.ActiveCfg = Release|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x64.Build.0 = Release|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x86.ActiveCfg = Release|Any CPU - {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x86.Build.0 = Release|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x64.ActiveCfg = Debug|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x64.Build.0 = Debug|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x86.ActiveCfg = Debug|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x86.Build.0 = Debug|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|Any CPU.Build.0 = Release|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x64.ActiveCfg = Release|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x64.Build.0 = Release|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x86.ActiveCfg = Release|Any CPU - {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x86.Build.0 = Release|Any CPU - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x64.ActiveCfg = Debug|x64 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x64.Build.0 = Debug|x64 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x86.ActiveCfg = Debug|x86 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x86.Build.0 = Debug|x86 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|Any CPU.Build.0 = Release|Any CPU - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x64.ActiveCfg = Release|x64 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x64.Build.0 = Release|x64 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x86.ActiveCfg = Release|x86 - {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x86.Build.0 = Release|x86 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x64.ActiveCfg = Debug|x64 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x64.Build.0 = Debug|x64 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x86.ActiveCfg = Debug|x86 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x86.Build.0 = Debug|x86 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|Any CPU.Build.0 = Release|Any CPU - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x64.ActiveCfg = Release|x64 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x64.Build.0 = Release|x64 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x86.ActiveCfg = Release|x86 - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x86.Build.0 = Release|x86 - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x64.ActiveCfg = Debug|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x64.Build.0 = Debug|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x86.ActiveCfg = Debug|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x86.Build.0 = Debug|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|Any CPU.Build.0 = Release|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x64.ActiveCfg = Release|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x64.Build.0 = Release|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x86.ActiveCfg = Release|Any CPU - {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {D4D997F5-854E-4B1F-8B08-7983F320032F} = {3967FFF0-ED1D-40D0-A169-D04239AA60BC} - {61E0D926-BC61-489F-A6FA-E9EEDD486812} = {3967FFF0-ED1D-40D0-A169-D04239AA60BC} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3B39A216-F902-4215-8555-BD292219247C} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29326.143 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpClient-TestEcho", "TcpClient-TestEcho\TcpClient-TestEcho.csproj", "{C76C5BFC-6741-464D-8C19-1B526F546627}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Models", "Models\Models.csproj", "{EFF012B0-9AF5-46A7-BF05-C1DE109E4785}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPullServer-TestEcho", "TcpPullServer-TestEcho\TcpPullServer-TestEcho.csproj", "{72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPullClient-TestEcho", "TcpPullClient-TestEcho\TcpPullClient-TestEcho.csproj", "{C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPackServer-TestEcho", "TcpPackServer-TestEcho\TcpPackServer-TestEcho.csproj", "{6A4AE1C7-C545-4020-AB44-905D2889D031}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPackClient-TestEcho", "TcpPackClient-TestEcho\TcpPackClient-TestEcho.csproj", "{F4EDF210-CAB7-412D-B001-F4F210E88C0C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPackAgent-TestEcho", "TcpPackAgent-TestEcho\TcpPackAgent-TestEcho.csproj", "{2AB65132-8A20-4016-9BA3-9996DC0B3F33}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPullAgent-TestEcho", "TcpPullAgent-TestEcho\TcpPullAgent-TestEcho.csproj", "{79952989-BB34-47DE-86E1-912225656F75}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpAgent-TestEcho", "TcpAgent-TestEcho\TcpAgent-TestEcho.csproj", "{23376F16-1967-45F7-8E52-4F5A36B94062}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SslAgent-TestEcho", "SslAgent-TestEcho\SslAgent-TestEcho.csproj", "{DE048EE0-40DB-4D11-A216-DA676F458699}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SslClient-TestEcho", "SslClient-TestEcho\SslClient-TestEcho.csproj", "{6F52CBB9-A48F-46D7-8E5E-F631C4E15874}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SslServer-TestEcho", "SslServer-TestEcho\SslServer-TestEcho.csproj", "{B59D79CC-DD24-46AD-BCE5-A2FF802C8336}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSocketServer-TestEcho", "netcoreapp\WebSocketServer-TestEcho\WebSocketServer-TestEcho.csproj", "{D4D997F5-854E-4B1F-8B08-7983F320032F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSocketClient-TestEcho", "netcoreapp\WebSocketClient-TestEcho\WebSocketClient-TestEcho.csproj", "{61E0D926-BC61-489F-A6FA-E9EEDD486812}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpPortForwarding", "TcpPortForwarding\TcpPortForwarding.csproj", "{3EEE8931-3B36-409F-9FA5-6A31AE08BB51}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "netcoreapp", "netcoreapp", "{3967FFF0-ED1D-40D0-A169-D04239AA60BC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpServer-TestEcho", "TcpServer-TestEcho\TcpServer-TestEcho.csproj", "{5BC55483-F140-4C87-B6DD-ECA268DEBD9C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpServer-TestEcho-Adapter", "TcpServer-TestEcho-Adapter\TcpServer-TestEcho-Adapter.csproj", "{BB5B3E95-69CF-4867-8C0E-C989525342DA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x64.ActiveCfg = Debug|x64 + {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x64.Build.0 = Debug|x64 + {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x86.ActiveCfg = Debug|x86 + {C76C5BFC-6741-464D-8C19-1B526F546627}.Debug|x86.Build.0 = Debug|x86 + {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|Any CPU.Build.0 = Release|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x64.ActiveCfg = Release|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x64.Build.0 = Release|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x86.ActiveCfg = Release|Any CPU + {C76C5BFC-6741-464D-8C19-1B526F546627}.Release|x86.Build.0 = Release|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x64.ActiveCfg = Debug|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x64.Build.0 = Debug|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x86.ActiveCfg = Debug|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Debug|x86.Build.0 = Debug|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|Any CPU.Build.0 = Release|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x64.ActiveCfg = Release|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x64.Build.0 = Release|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x86.ActiveCfg = Release|Any CPU + {EFF012B0-9AF5-46A7-BF05-C1DE109E4785}.Release|x86.Build.0 = Release|Any CPU + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x64.ActiveCfg = Debug|x64 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x64.Build.0 = Debug|x64 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x86.ActiveCfg = Debug|x86 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Debug|x86.Build.0 = Debug|x86 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|Any CPU.Build.0 = Release|Any CPU + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x64.ActiveCfg = Release|x64 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x64.Build.0 = Release|x64 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x86.ActiveCfg = Release|x86 + {72D403A8-024D-4DE1-BB1C-CFEE7C42EAD1}.Release|x86.Build.0 = Release|x86 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x64.ActiveCfg = Debug|x64 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x64.Build.0 = Debug|x64 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x86.ActiveCfg = Debug|x86 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Debug|x86.Build.0 = Debug|x86 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|Any CPU.Build.0 = Release|Any CPU + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x64.ActiveCfg = Release|x64 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x64.Build.0 = Release|x64 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x86.ActiveCfg = Release|x86 + {C972F0FD-5CB6-4BE4-850E-DD6BDEB681ED}.Release|x86.Build.0 = Release|x86 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x64.ActiveCfg = Debug|x64 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x64.Build.0 = Debug|x64 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x86.ActiveCfg = Debug|x86 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Debug|x86.Build.0 = Debug|x86 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|Any CPU.Build.0 = Release|Any CPU + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x64.ActiveCfg = Release|x64 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x64.Build.0 = Release|x64 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x86.ActiveCfg = Release|x86 + {6A4AE1C7-C545-4020-AB44-905D2889D031}.Release|x86.Build.0 = Release|x86 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x64.ActiveCfg = Debug|x64 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x64.Build.0 = Debug|x64 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x86.ActiveCfg = Debug|x86 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Debug|x86.Build.0 = Debug|x86 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|Any CPU.Build.0 = Release|Any CPU + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x64.ActiveCfg = Release|x64 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x64.Build.0 = Release|x64 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x86.ActiveCfg = Release|x86 + {F4EDF210-CAB7-412D-B001-F4F210E88C0C}.Release|x86.Build.0 = Release|x86 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x64.ActiveCfg = Debug|x64 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x64.Build.0 = Debug|x64 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x86.ActiveCfg = Debug|x86 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Debug|x86.Build.0 = Debug|x86 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|Any CPU.Build.0 = Release|Any CPU + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x64.ActiveCfg = Release|x64 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x64.Build.0 = Release|x64 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x86.ActiveCfg = Release|x86 + {2AB65132-8A20-4016-9BA3-9996DC0B3F33}.Release|x86.Build.0 = Release|x86 + {79952989-BB34-47DE-86E1-912225656F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79952989-BB34-47DE-86E1-912225656F75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79952989-BB34-47DE-86E1-912225656F75}.Debug|x64.ActiveCfg = Debug|x64 + {79952989-BB34-47DE-86E1-912225656F75}.Debug|x64.Build.0 = Debug|x64 + {79952989-BB34-47DE-86E1-912225656F75}.Debug|x86.ActiveCfg = Debug|x86 + {79952989-BB34-47DE-86E1-912225656F75}.Debug|x86.Build.0 = Debug|x86 + {79952989-BB34-47DE-86E1-912225656F75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79952989-BB34-47DE-86E1-912225656F75}.Release|Any CPU.Build.0 = Release|Any CPU + {79952989-BB34-47DE-86E1-912225656F75}.Release|x64.ActiveCfg = Release|x64 + {79952989-BB34-47DE-86E1-912225656F75}.Release|x64.Build.0 = Release|x64 + {79952989-BB34-47DE-86E1-912225656F75}.Release|x86.ActiveCfg = Release|x86 + {79952989-BB34-47DE-86E1-912225656F75}.Release|x86.Build.0 = Release|x86 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x64.ActiveCfg = Debug|x64 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x64.Build.0 = Debug|x64 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x86.ActiveCfg = Debug|x86 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Debug|x86.Build.0 = Debug|x86 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|Any CPU.Build.0 = Release|Any CPU + {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x64.ActiveCfg = Release|x64 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x64.Build.0 = Release|x64 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x86.ActiveCfg = Release|x86 + {23376F16-1967-45F7-8E52-4F5A36B94062}.Release|x86.Build.0 = Release|x86 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x64.ActiveCfg = Debug|x64 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x64.Build.0 = Debug|x64 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x86.ActiveCfg = Debug|x86 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Debug|x86.Build.0 = Debug|x86 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|Any CPU.Build.0 = Release|Any CPU + {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x64.ActiveCfg = Release|x64 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x64.Build.0 = Release|x64 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x86.ActiveCfg = Release|x86 + {DE048EE0-40DB-4D11-A216-DA676F458699}.Release|x86.Build.0 = Release|x86 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x64.ActiveCfg = Debug|x64 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x64.Build.0 = Debug|x64 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x86.ActiveCfg = Debug|x86 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Debug|x86.Build.0 = Debug|x86 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|Any CPU.Build.0 = Release|Any CPU + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x64.ActiveCfg = Release|x64 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x64.Build.0 = Release|x64 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x86.ActiveCfg = Release|x86 + {6F52CBB9-A48F-46D7-8E5E-F631C4E15874}.Release|x86.Build.0 = Release|x86 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x64.ActiveCfg = Debug|x64 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x64.Build.0 = Debug|x64 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x86.ActiveCfg = Debug|x86 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Debug|x86.Build.0 = Debug|x86 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|Any CPU.Build.0 = Release|Any CPU + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x64.ActiveCfg = Release|x64 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x64.Build.0 = Release|x64 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x86.ActiveCfg = Release|x86 + {B59D79CC-DD24-46AD-BCE5-A2FF802C8336}.Release|x86.Build.0 = Release|x86 + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x64.ActiveCfg = Debug|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x64.Build.0 = Debug|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x86.ActiveCfg = Debug|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Debug|x86.Build.0 = Debug|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|Any CPU.Build.0 = Release|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x64.ActiveCfg = Release|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x64.Build.0 = Release|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x86.ActiveCfg = Release|Any CPU + {D4D997F5-854E-4B1F-8B08-7983F320032F}.Release|x86.Build.0 = Release|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x64.ActiveCfg = Debug|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x64.Build.0 = Debug|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x86.ActiveCfg = Debug|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Debug|x86.Build.0 = Debug|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|Any CPU.Build.0 = Release|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x64.ActiveCfg = Release|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x64.Build.0 = Release|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x86.ActiveCfg = Release|Any CPU + {61E0D926-BC61-489F-A6FA-E9EEDD486812}.Release|x86.Build.0 = Release|Any CPU + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x64.ActiveCfg = Debug|x64 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x64.Build.0 = Debug|x64 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x86.ActiveCfg = Debug|x86 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Debug|x86.Build.0 = Debug|x86 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|Any CPU.Build.0 = Release|Any CPU + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x64.ActiveCfg = Release|x64 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x64.Build.0 = Release|x64 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x86.ActiveCfg = Release|x86 + {3EEE8931-3B36-409F-9FA5-6A31AE08BB51}.Release|x86.Build.0 = Release|x86 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x64.ActiveCfg = Debug|x64 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x64.Build.0 = Debug|x64 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x86.ActiveCfg = Debug|x86 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Debug|x86.Build.0 = Debug|x86 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|Any CPU.Build.0 = Release|Any CPU + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x64.ActiveCfg = Release|x64 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x64.Build.0 = Release|x64 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x86.ActiveCfg = Release|x86 + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C}.Release|x86.Build.0 = Release|x86 + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x64.ActiveCfg = Debug|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x64.Build.0 = Debug|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x86.ActiveCfg = Debug|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Debug|x86.Build.0 = Debug|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|Any CPU.Build.0 = Release|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x64.ActiveCfg = Release|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x64.Build.0 = Release|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x86.ActiveCfg = Release|Any CPU + {BB5B3E95-69CF-4867-8C0E-C989525342DA}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {D4D997F5-854E-4B1F-8B08-7983F320032F} = {3967FFF0-ED1D-40D0-A169-D04239AA60BC} + {61E0D926-BC61-489F-A6FA-E9EEDD486812} = {3967FFF0-ED1D-40D0-A169-D04239AA60BC} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3B39A216-F902-4215-8555-BD292219247C} + EndGlobalSection +EndGlobal diff --git a/demo/TcpServer-TestEcho-Adapter/DataReceiveAdapter/TextDataReceiveAdapter.cs b/demo/TcpServer-TestEcho-Adapter/DataReceiveAdapter/TextDataReceiveAdapter.cs index 6770a3a..fc35f6f 100644 --- a/demo/TcpServer-TestEcho-Adapter/DataReceiveAdapter/TextDataReceiveAdapter.cs +++ b/demo/TcpServer-TestEcho-Adapter/DataReceiveAdapter/TextDataReceiveAdapter.cs @@ -4,7 +4,7 @@ using HPSocket.Adapter; namespace TcpServerTestEchoAdapter.DataReceiveAdapter { /// - /// 定长包数据接收适配器 + /// 指定终止符包数据接收适配器 /// public class TextDataReceiveAdapter : TerminatorDataReceiveAdapter { diff --git a/demo/TcpServer-TestEcho-Adapter/Program-Terminator.cs b/demo/TcpServer-TestEcho-Adapter/Program-Terminator.cs index c4ac02e..db4b33f 100644 --- a/demo/TcpServer-TestEcho-Adapter/Program-Terminator.cs +++ b/demo/TcpServer-TestEcho-Adapter/Program-Terminator.cs @@ -6,7 +6,7 @@ using TcpServerTestEchoAdapter.DataReceiveAdapter; namespace TcpServerTestEchoAdapter { /// - /// 定长包数据适配器示例 + /// 指定终止符数据适配器示例 /// class ProgramTerminator { diff --git a/demo/TcpServer-TestEcho/AsyncQueue/AsyncQueue.cs b/demo/TcpServer-TestEcho/AsyncQueue/AsyncQueue.cs new file mode 100644 index 0000000..9473005 --- /dev/null +++ b/demo/TcpServer-TestEcho/AsyncQueue/AsyncQueue.cs @@ -0,0 +1,71 @@ +#if !NET20 +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace HPSocket.AsyncQueue +{ + /// + /// 多消费者异步消费队列 + /// + /// + public class AsyncQueue : IDisposable + { + #region 私有 + /// + /// 数据操作类 + /// + private ConcurrentBag> workers { get; set; } + /// + /// 消费队列实体 + /// + private BlockingCollection queue { get; set; } + /// + /// 控制线程令牌源 + /// + private CancellationTokenSource cts { get; set; } + #endregion + /// + /// 构造方法 + /// + /// 消费者数量 + /// 任务处理函数 + public AsyncQueue(uint consumerCount, Action taskProc) + { + if (consumerCount == 0) { throw new ArgumentException($"{nameof(consumerCount)} must be > 0"); } + if (taskProc == null) { throw new ArgumentNullException($"{nameof(taskProc)} must not be null"); } + workers = new ConcurrentBag>(); + queue = new BlockingCollection(); + cts = new CancellationTokenSource(); + for (var i = 0; i < consumerCount; i++) + { + workers.Add(new Worker(queue, taskProc, cts.Token)); + } + } + /// + /// 剩余数据数量 + /// + /// + public int Count { get => this.queue.Count; } + /// + /// 队列添加数据 + /// + /// 数据实体 + /// 成功返回true,失败返回false + public bool Enqueue(T item) => this.queue.TryAdd(item); + /// + /// 停止消费 + /// + public void Shutdown() + { + this.cts.Cancel(); + while (!this.workers.IsEmpty) + { + Worker w; + this.workers.TryTake(out w); + } + } + public void Dispose() => Shutdown(); + } +} +#endif \ No newline at end of file diff --git a/demo/TcpServer-TestEcho/AsyncQueue/Worker.cs b/demo/TcpServer-TestEcho/AsyncQueue/Worker.cs new file mode 100644 index 0000000..2863524 --- /dev/null +++ b/demo/TcpServer-TestEcho/AsyncQueue/Worker.cs @@ -0,0 +1,56 @@ +#if !NET20 +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; + +namespace HPSocket.AsyncQueue +{ + public class Worker + { + /// + /// 消费队列实体 + /// + private readonly BlockingCollection collection; + /// + /// 任务处理函数 + /// + private readonly Action taskProc; + /// + /// 控制线程令牌 + /// + private CancellationToken ct { get; set; } + /// + /// 构造方法 + /// + /// 消费队列实体 + /// 任务处理函数 + /// + public Worker(BlockingCollection collection, Action taskProc, CancellationToken ct) + { + this.collection = collection ?? throw new ArgumentNullException(nameof(collection)); + this.taskProc = taskProc ?? throw new ArgumentNullException(nameof(taskProc)); + this.ct = ct; + Task.Factory.StartNew(this.DoWork, ct); + } + /// + /// 消费数据方法 + /// + private void DoWork() + { + while (!this.ct.IsCancellationRequested) + { + try + { + var item = this.collection.Take(this.ct); + this.taskProc?.Invoke(item); + } + catch (OperationCanceledException) + { + //令牌已取消 + } + } + } + } +} +#endif \ No newline at end of file diff --git a/demo/TcpServer-TestEcho/FormServer.cs b/demo/TcpServer-TestEcho/FormServer.cs index 5332c07..a9a2aee 100644 --- a/demo/TcpServer-TestEcho/FormServer.cs +++ b/demo/TcpServer-TestEcho/FormServer.cs @@ -1,16 +1,21 @@ -using System; +//#define ThreadPool +#define AsyncQueue +using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Windows.Forms; using HPSocket; using HPSocket.Tcp; -using HPSocket.Thread; using Models; using Newtonsoft.Json; -using ThreadPool = HPSocket.Thread.ThreadPool; using Timer = System.Timers.Timer; - +#if ThreadPool +using HPSocket.Thread; +using ThreadPool = HPSocket.Thread.ThreadPool; +#elif AsyncQueue +using HPSocket.AsyncQueue; +#endif namespace TcpServerTestEcho { public partial class FormServer : Form @@ -18,13 +23,18 @@ namespace TcpServerTestEcho delegate void AddLogHandler(string log); #pragma warning disable IDE0069 // 应释放可释放的字段 - private readonly ITcpServer _server = new TcpServer(); - + private readonly ITcpServer _server = new TcpServer(); +#if ThreadPool /// /// 线程池 /// private readonly ThreadPool _threadPool = new ThreadPool(); - +#elif AsyncQueue + /// + /// 异步消费者队列 + /// + private AsyncQueue _asyncQueue; +#endif /// /// 定时器 /// @@ -34,12 +44,12 @@ namespace TcpServerTestEcho }; #pragma warning restore IDE0069 // 应释放可释放的字段 - +#if ThreadPool /// /// 线程池回调函数 /// private TaskProcEx _taskTaskProc; - +#endif /// /// 最大封包长度 /// @@ -68,9 +78,9 @@ namespace TcpServerTestEcho _server.OnAccept += OnAccept; _server.OnReceive += OnReceive; _server.OnClose += OnClose; - _server.OnShutdown += OnShutdown; - - + _server.OnShutdown += OnShutdown; + +#if ThreadPool // 线程池相关设置 // 线程池回调函数 _taskTaskProc = TaskTaskProc; @@ -83,6 +93,19 @@ namespace TcpServerTestEcho AddLog($"线程池当前在执行的任务数: {_threadPool.TaskCount}, 任务队列数: {_threadPool.QueueSize}"); } }; +#elif AsyncQueue + uint ConsumerCount = 2; + _asyncQueue = new AsyncQueue(ConsumerCount, TaskTaskProc); + + // 定时输出线程池任务数 + _timer.Elapsed += (_, args) => + { + if (_server.HasStarted) + { + AddLog($"异步消费者队列的消费者数: {ConsumerCount}, 未执行任务队列数: {_asyncQueue.Count}"); + } + }; +#endif _timer.Start(); } @@ -90,13 +113,18 @@ namespace TcpServerTestEcho { if (_server.HasStarted) { - MessageBox.Show(@"请先停止服务", @"服务正在运行:", MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show(@"请先停止服务", @"服务正在运行:", MessageBoxButtons.OK, MessageBoxIcon.Warning); +#if AsyncQueue + _asyncQueue.Shutdown(); +#endif e.Cancel = true; return; } +#if ThreadPool // 停止并释放线程池, 会等待所有任务结束 _threadPool.Dispose(); +#endif // 停止并释放定时器 _timer.Stop(); @@ -285,10 +313,15 @@ namespace TcpServerTestEcho break; } case PacketType.Time: // 假如获取服务器时间是耗时操作, 将该操作放入队列 - { + { +#if ThreadPool // 向线程池提交任务 if (!_threadPool.Submit(_taskTaskProc, new TaskInfo - { +#elif AsyncQueue + // 向异步队列添加数据 + if (!_asyncQueue.Enqueue(new TaskInfo +#endif + { Client = client, Packet = packet, })) @@ -303,19 +336,23 @@ namespace TcpServerTestEcho break; } return result; - } - + } + /// /// 线程池任务回调函数 /// /// 任务参数 +#if ThreadPool private void TaskTaskProc(object obj) { if (!(obj is TaskInfo taskInfo)) { return; } - +#elif AsyncQueue + private void TaskTaskProc(TaskInfo taskInfo) + { +#endif // 如果连接已经断开了(可能被踢了) // 它的任务就不做了(根据自己业务需求来, 也许你的任务就是要完成每个连接的所有任务, 每个包都要处理, 不管连接断开与否, 就不要写这个判断, 但是你回发包的时候要判断是否有效连接) if (!_server.IsConnected(taskInfo.Client.ConnId)) @@ -391,14 +428,15 @@ namespace TcpServerTestEcho try { if (btnSwitchService.Text == @"启动") - { - // 2个线程处理耗时操作, 作为相对耗时的任务, 可根据业务需求多开线程处理 + { +#if ThreadPool + // 2个线程处理耗时操作, 作为相对耗时的任务, 可根据业务需求多开线程处理 if (!_threadPool.Start(2, RejectedPolicy.WaitFor)) { btnSwitchService.Enabled = false; throw new Exception($"线程池启动失败, 错误码: {_threadPool.ErrorCode}"); } - +#endif // 启动服务 if (!_server.Start()) { @@ -406,10 +444,10 @@ namespace TcpServerTestEcho } btnSwitchService.Text = @"停止"; - +#if ThreadPool // 等待线程池停止 await _threadPool.WaitAsync(); - +#endif // 等待服务停止 await _server.WaitAsync(); @@ -420,11 +458,12 @@ namespace TcpServerTestEcho } else { - btnSwitchService.Enabled = false; + btnSwitchService.Enabled = false; +#if ThreadPool // 停止并等待线程池任务全部完成 await _threadPool.StopAsync(); - - // 等待服务停止 +#endif + // 等待服务停止 await _server.StopAsync(); } } diff --git a/demo/TcpServer-TestEcho/TcpServer-TestEcho.csproj b/demo/TcpServer-TestEcho/TcpServer-TestEcho.csproj index cd26fd8..7b4d0eb 100644 --- a/demo/TcpServer-TestEcho/TcpServer-TestEcho.csproj +++ b/demo/TcpServer-TestEcho/TcpServer-TestEcho.csproj @@ -1,153 +1,155 @@ - - - - - Debug - AnyCPU - {5BC55483-F140-4C87-B6DD-ECA268DEBD9C} - WinExe - TcpServerTestEcho - TcpServer-TestEcho - v4.8 - 512 - true - - - - - - AnyCPU - true - full - false - ..\Bin\ - DEBUG;TRACE - prompt - 4 - false - - - AnyCPU - pdbonly - true - ..\Bin\ - TRACE - prompt - 4 - false - - - app.manifest - - - true - ..\Bin\ - DEBUG;TRACE - full - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - ..\Bin\ - TRACE - true - pdbonly - x64 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - true - ..\Bin\ - DEBUG;TRACE - full - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - ..\Bin\ - TRACE - true - pdbonly - x86 - 7.3 - prompt - MinimumRecommendedRules.ruleset - - - - ..\packages\HPSocket.Net.5.7.1-rc2\lib\net48\HPSocket.Net.dll - - - ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - Form - - - FormServer.cs - - - - - FormServer.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {eff012b0-9af5-46a7-bf05-c1de109e4785} - Models - - - - - - - - - - - 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - - + + + + + Debug + AnyCPU + {5BC55483-F140-4C87-B6DD-ECA268DEBD9C} + WinExe + TcpServerTestEcho + TcpServer-TestEcho + v4.8 + 512 + true + + + + + + AnyCPU + true + full + false + ..\Bin\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + ..\Bin\ + TRACE + prompt + 4 + false + + + app.manifest + + + true + ..\Bin\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + ..\Bin\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + true + ..\Bin\ + DEBUG;TRACE + full + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + ..\Bin\ + TRACE + true + pdbonly + x86 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\HPSocket.Net.5.7.1-rc2\lib\net48\HPSocket.Net.dll + + + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + Form + + + FormServer.cs + + + + + FormServer.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {eff012b0-9af5-46a7-bf05-c1de109e4785} + Models + + + + + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + \ No newline at end of file -- Gitee From 088ead97136759413a2d9fd7fca799af597b3785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E7=88=B1=E8=8B=B9=E6=9E=9CC?= <842352715@qq.com> Date: Mon, 23 Dec 2019 15:26:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E6=B6=88=E8=B4=B9=E8=80=85=E9=98=9F=E5=88=97=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=8C=E5=8F=AF=E4=BB=A3=E6=9B=BF=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=B1=A0=E6=96=B9=E5=BC=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/HPSocket.Net/AsyncQueue/AsyncQueue.cs | 71 +++++++++++++++++++++++ src/HPSocket.Net/AsyncQueue/Worker.cs | 56 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/HPSocket.Net/AsyncQueue/AsyncQueue.cs create mode 100644 src/HPSocket.Net/AsyncQueue/Worker.cs diff --git a/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs b/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs new file mode 100644 index 0000000..9473005 --- /dev/null +++ b/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs @@ -0,0 +1,71 @@ +#if !NET20 +using System; +using System.Collections.Concurrent; +using System.Threading; + +namespace HPSocket.AsyncQueue +{ + /// + /// 多消费者异步消费队列 + /// + /// + public class AsyncQueue : IDisposable + { + #region 私有 + /// + /// 数据操作类 + /// + private ConcurrentBag> workers { get; set; } + /// + /// 消费队列实体 + /// + private BlockingCollection queue { get; set; } + /// + /// 控制线程令牌源 + /// + private CancellationTokenSource cts { get; set; } + #endregion + /// + /// 构造方法 + /// + /// 消费者数量 + /// 任务处理函数 + public AsyncQueue(uint consumerCount, Action taskProc) + { + if (consumerCount == 0) { throw new ArgumentException($"{nameof(consumerCount)} must be > 0"); } + if (taskProc == null) { throw new ArgumentNullException($"{nameof(taskProc)} must not be null"); } + workers = new ConcurrentBag>(); + queue = new BlockingCollection(); + cts = new CancellationTokenSource(); + for (var i = 0; i < consumerCount; i++) + { + workers.Add(new Worker(queue, taskProc, cts.Token)); + } + } + /// + /// 剩余数据数量 + /// + /// + public int Count { get => this.queue.Count; } + /// + /// 队列添加数据 + /// + /// 数据实体 + /// 成功返回true,失败返回false + public bool Enqueue(T item) => this.queue.TryAdd(item); + /// + /// 停止消费 + /// + public void Shutdown() + { + this.cts.Cancel(); + while (!this.workers.IsEmpty) + { + Worker w; + this.workers.TryTake(out w); + } + } + public void Dispose() => Shutdown(); + } +} +#endif \ No newline at end of file diff --git a/src/HPSocket.Net/AsyncQueue/Worker.cs b/src/HPSocket.Net/AsyncQueue/Worker.cs new file mode 100644 index 0000000..2863524 --- /dev/null +++ b/src/HPSocket.Net/AsyncQueue/Worker.cs @@ -0,0 +1,56 @@ +#if !NET20 +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; + +namespace HPSocket.AsyncQueue +{ + public class Worker + { + /// + /// 消费队列实体 + /// + private readonly BlockingCollection collection; + /// + /// 任务处理函数 + /// + private readonly Action taskProc; + /// + /// 控制线程令牌 + /// + private CancellationToken ct { get; set; } + /// + /// 构造方法 + /// + /// 消费队列实体 + /// 任务处理函数 + /// + public Worker(BlockingCollection collection, Action taskProc, CancellationToken ct) + { + this.collection = collection ?? throw new ArgumentNullException(nameof(collection)); + this.taskProc = taskProc ?? throw new ArgumentNullException(nameof(taskProc)); + this.ct = ct; + Task.Factory.StartNew(this.DoWork, ct); + } + /// + /// 消费数据方法 + /// + private void DoWork() + { + while (!this.ct.IsCancellationRequested) + { + try + { + var item = this.collection.Take(this.ct); + this.taskProc?.Invoke(item); + } + catch (OperationCanceledException) + { + //令牌已取消 + } + } + } + } +} +#endif \ No newline at end of file -- Gitee From 1a2448eef8a6c5a8bf276b2da14f4a98b3d7650b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=88=91=E7=88=B1=E8=8B=B9=E6=9E=9CC?= <842352715@qq.com> Date: Tue, 24 Dec 2019 11:10:05 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=BC=82=E6=AD=A5=E9=98=9F=E5=88=97AsyncQu?= =?UTF-8?q?eue=E4=BF=AE=E6=94=B9=20=E6=B7=BB=E5=8A=A0=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E8=80=85=E6=95=B0=E9=87=8F=E5=B1=9E=E6=80=A7ConsumerCount?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=A2=9E=E5=88=A0=E6=B6=88=E8=B4=B9=E8=80=85?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/HPSocket.Net/AsyncQueue/AsyncQueue.cs | 47 ++++++++++++++++++----- src/HPSocket.Net/AsyncQueue/Worker.cs | 20 ++++++---- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs b/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs index 9473005..7e92b83 100644 --- a/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs +++ b/src/HPSocket.Net/AsyncQueue/AsyncQueue.cs @@ -1,7 +1,6 @@ #if !NET20 using System; using System.Collections.Concurrent; -using System.Threading; namespace HPSocket.AsyncQueue { @@ -21,9 +20,9 @@ namespace HPSocket.AsyncQueue /// private BlockingCollection queue { get; set; } /// - /// 控制线程令牌源 + /// 任务处理函数 /// - private CancellationTokenSource cts { get; set; } + private Action taskProc { get; set; } #endregion /// /// 构造方法 @@ -34,12 +33,12 @@ namespace HPSocket.AsyncQueue { if (consumerCount == 0) { throw new ArgumentException($"{nameof(consumerCount)} must be > 0"); } if (taskProc == null) { throw new ArgumentNullException($"{nameof(taskProc)} must not be null"); } - workers = new ConcurrentBag>(); - queue = new BlockingCollection(); - cts = new CancellationTokenSource(); + this.workers = new ConcurrentBag>(); + this.queue = new BlockingCollection(); + this.taskProc = taskProc; for (var i = 0; i < consumerCount; i++) { - workers.Add(new Worker(queue, taskProc, cts.Token)); + workers.Add(new Worker(queue, taskProc)); } } /// @@ -54,15 +53,43 @@ namespace HPSocket.AsyncQueue /// 成功返回true,失败返回false public bool Enqueue(T item) => this.queue.TryAdd(item); /// + /// 消费者数量 + /// + public int ConsumerCount { get => this.workers.Count; } + /// + /// 添加消费者 + /// + public void AddConsumer(uint consumerCount) + { + for (var i = 0; i < consumerCount; i++) + { + workers.Add(new Worker(queue, taskProc)); + } + } + /// + /// 删除消费者 + /// + public void RemoveConsumer(uint consumerCount) + { + while (!this.workers.IsEmpty && consumerCount-- > 0) + { + if(workers.TryTake(out var w)) + { + w.Stop(); + } + } + } + /// /// 停止消费 /// public void Shutdown() { - this.cts.Cancel(); while (!this.workers.IsEmpty) { - Worker w; - this.workers.TryTake(out w); + if(workers.TryTake(out var w)) + { + w.Stop(); + } } } public void Dispose() => Shutdown(); diff --git a/src/HPSocket.Net/AsyncQueue/Worker.cs b/src/HPSocket.Net/AsyncQueue/Worker.cs index 2863524..bbbda77 100644 --- a/src/HPSocket.Net/AsyncQueue/Worker.cs +++ b/src/HPSocket.Net/AsyncQueue/Worker.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace HPSocket.AsyncQueue { - public class Worker + public class Worker :IDisposable { /// /// 消费队列实体 @@ -19,30 +19,30 @@ namespace HPSocket.AsyncQueue /// /// 控制线程令牌 /// - private CancellationToken ct { get; set; } + private CancellationTokenSource cts { get; set; } /// /// 构造方法 /// /// 消费队列实体 /// 任务处理函数 /// - public Worker(BlockingCollection collection, Action taskProc, CancellationToken ct) + public Worker(BlockingCollection collection, Action taskProc) { this.collection = collection ?? throw new ArgumentNullException(nameof(collection)); this.taskProc = taskProc ?? throw new ArgumentNullException(nameof(taskProc)); - this.ct = ct; - Task.Factory.StartNew(this.DoWork, ct); + this.cts = new CancellationTokenSource(); + Task.Factory.StartNew(this.DoWork, cts.Token); } /// /// 消费数据方法 /// private void DoWork() { - while (!this.ct.IsCancellationRequested) + while (!this.cts.Token.IsCancellationRequested) { try { - var item = this.collection.Take(this.ct); + var item = this.collection.Take(this.cts.Token); this.taskProc?.Invoke(item); } catch (OperationCanceledException) @@ -51,6 +51,12 @@ namespace HPSocket.AsyncQueue } } } + /// + /// 停止线程工作 + /// + public void Stop() => cts.Cancel(); + + public void Dispose() => Stop(); } } #endif \ No newline at end of file -- Gitee