From 8d24cc0d5117d96eedfb3579a855b4754e92072c Mon Sep 17 00:00:00 2001 From: Aigio Liu Date: Tue, 25 Jul 2023 16:17:09 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20peer=20delegate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IPC/IPCMainProcessServiceImpl.cs | 109 ++++++++++-------- 1 file changed, 58 insertions(+), 51 deletions(-) diff --git a/src/BD.WTTS.Client/Services.Implementation/IPC/IPCMainProcessServiceImpl.cs b/src/BD.WTTS.Client/Services.Implementation/IPC/IPCMainProcessServiceImpl.cs index cd8d729bc..046755a9c 100644 --- a/src/BD.WTTS.Client/Services.Implementation/IPC/IPCMainProcessServiceImpl.cs +++ b/src/BD.WTTS.Client/Services.Implementation/IPC/IPCMainProcessServiceImpl.cs @@ -285,7 +285,8 @@ public sealed partial class IPCMainProcessServiceImpl : IPCMainProcessService } } - readonly ConcurrentDictionary peerConnectionBrokenTimer = new(); + readonly HashSet peerHashCodes = new(); + //readonly ConcurrentDictionary peerConnectionBrokenTimer = new(); public async ValueTask GetServiceAsync(string moduleName) where T : class { @@ -297,73 +298,79 @@ public sealed partial class IPCMainProcessServiceImpl : IPCMainProcessService var peerName = IPCSubProcessModuleService.Constants.GetClientPipeName( moduleName, ipcProvider.IpcContext.PipeName); var peer = await ipcProvider.GetAndConnectToPeerAsync(peerName); -#if DEBUG - peer.MessageReceived += (_, e) => - { - - }; - peer.PeerReconnected += (_, _) => - { -#if DEBUG - logger.LogError("断开重连 {peerName}", peer.PeerName); -#endif - }; -#endif if (peer != null) { - peer.PeerConnectionBroken += async (_, _) => + var peerHashCode = peer.GetHashCode(); + if (peerHashCodes.Add(peerHashCode)) // peer 委托避免重复 += { - if (disposedValue || ipcProvider == null) - return; // 被释放或者 ipc 提供者为 null 则跳过 #if DEBUG - logger.LogError("连接断开 {peerName}", peer.PeerName); -#endif - try + peer.MessageReceived += (_, e) => { - if (peerConnectionBrokenTimer.TryGetValue(moduleName, out var time)) - { - if ((DateTime.Now - time).TotalMilliseconds >= 3700.5D) - { - // 4.7s 内多次触发不执行重新启动进程 - return; - } - } - } - finally + + }; + peer.PeerReconnected += (_, _) => { - // 记录此模块当前断开连接的时间 - peerConnectionBrokenTimer.AddOrUpdate(moduleName, - static _ => DateTime.Now, - static (_, _) => DateTime.Now); - } +#if DEBUG + logger.LogError("断开重连 {peerName}", peer.PeerName); +#endif + }; +#endif - if (subProcesses.TryGetValue(moduleName, out var subProcess)) + peer.PeerConnectionBroken += async (_, _) => { - subProcesses.TryRemove(moduleName, out var _); - if (!subProcess.HasExited) + if (disposedValue || ipcProvider == null) + return; // 被释放或者 ipc 提供者为 null 则跳过 +#if DEBUG + logger.LogError("连接断开 {peerName}", peer.PeerName); +#endif + //try + //{ + // if (peerConnectionBrokenTimer.TryGetValue(moduleName, out var time)) + // { + // if ((DateTime.Now - time).TotalMilliseconds >= 3700.5D) + // { + // // 4.7s 内多次触发不执行重新启动进程 + // return; + // } + // } + //} + //finally + //{ + // // 记录此模块当前断开连接的时间 + // peerConnectionBrokenTimer.AddOrUpdate(moduleName, + // static _ => DateTime.Now, + // static (_, _) => DateTime.Now); + //} + + if (subProcesses.TryGetValue(moduleName, out var subProcess)) { - subProcess.WaitForExit(3700); + subProcesses.TryRemove(moduleName, out var _); if (!subProcess.HasExited) { - try + subProcess.WaitForExit(3700); + if (!subProcess.HasExited) { - subProcess.KillEntireProcessTree(); - } - catch - { - + try + { + subProcess.KillEntireProcessTree(); + } + catch + { + + } } } } - } - if (startSubProcesses.TryGetValue(moduleName, out var startSubProcess)) - { - // 连接断开时重新启动进程 - await startSubProcess.Invoke(this); - } - }; + if (startSubProcesses.TryGetValue(moduleName, out var startSubProcess)) + { + // 连接断开时重新启动进程 + await startSubProcess.Invoke(this); + } + }; + } + var s = ipcProvider.CreateIpcProxy(peer); return s; } -- GitLab