diff --git a/examples/Modbus/ModbusMasterConsoleApp/Program.cs b/examples/Modbus/ModbusMasterConsoleApp/Program.cs index 400bc7c67..d164cfdc4 100644 --- a/examples/Modbus/ModbusMasterConsoleApp/Program.cs +++ b/examples/Modbus/ModbusMasterConsoleApp/Program.cs @@ -93,7 +93,12 @@ internal class Program public static async Task GetModbusTcpMasterAsync() { var client = new ModbusTcpMaster(); - + await client.SetupAsync(new TouchSocketConfig() + .ConfigurePlugins(a => + { + a.UseModbusTcpMasterReconnectionPlugin() + .UsePolling(TimeSpan.FromSeconds(1)); + })); await client.ConnectAsync("127.0.0.1:502"); return client; } @@ -162,4 +167,54 @@ internal class MyClass { public int P1 { get; set; } public int P2 { get; set; } +} + +public static class MasterReconnectionPluginExtension +{ + public static ReconnectionPlugin UseModbusTcpMasterReconnectionPlugin(this IPluginManager pluginManager) + { + ModbusTcpMasterReconnectionPlugin modbusTcpMasterReconnectionPlugin = new ModbusTcpMasterReconnectionPlugin(); + pluginManager.Add(modbusTcpMasterReconnectionPlugin); + return modbusTcpMasterReconnectionPlugin; + } +} + +internal sealed class ModbusTcpMasterReconnectionPlugin : ReconnectionPlugin, ITcpClosedPlugin +{ + public override Func> ActionForCheck { get; set; } + + public ModbusTcpMasterReconnectionPlugin() + { + this.ActionForCheck = (c, i) => Task.FromResult(c.Online); + } + + public async Task OnTcpClosed(ITcpSession client, ClosedEventArgs e) + { + await e.InvokeNext().ConfigureAwait(EasyTask.ContinueOnCapturedContext); + + if (client is not IModbusTcpMaster tClient) + { + return; + } + + if (e.Manual) + { + return; + } + + _ = Task.Run(async () => + { + while (true) + { + if (this.DisposedValue) + { + return; + } + if (await this.ActionForConnect.Invoke(tClient).ConfigureAwait(EasyTask.ContinueOnCapturedContext)) + { + return; + } + } + }); + } } \ No newline at end of file diff --git a/examples/Tcp/TcpConsoleApp/Program.cs b/examples/Tcp/TcpConsoleApp/Program.cs index b8a6fb098..68a3dfb6b 100644 --- a/examples/Tcp/TcpConsoleApp/Program.cs +++ b/examples/Tcp/TcpConsoleApp/Program.cs @@ -83,7 +83,7 @@ internal class Program .SetRemoteIPHost(new IPHost("127.0.0.1:7789")) .ConfigurePlugins(a => { - a.UseTcpReconnection() + a.UseTcpReconnection() .UsePolling(TimeSpan.FromSeconds(1)); }) .ConfigureContainer(a =>