mirror of
https://github.com/RRQM/TouchSocket.git
synced 2025-12-21 02:46:43 +08:00
新增:ModbusTcpMaster 重连示例(暂时)。
This commit is contained in:
@@ -93,7 +93,12 @@ internal class Program
|
||||
public static async Task<IModbusMaster> 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<IModbusTcpMaster> UseModbusTcpMasterReconnectionPlugin(this IPluginManager pluginManager)
|
||||
{
|
||||
ModbusTcpMasterReconnectionPlugin modbusTcpMasterReconnectionPlugin = new ModbusTcpMasterReconnectionPlugin();
|
||||
pluginManager.Add(modbusTcpMasterReconnectionPlugin);
|
||||
return modbusTcpMasterReconnectionPlugin;
|
||||
}
|
||||
}
|
||||
|
||||
internal sealed class ModbusTcpMasterReconnectionPlugin : ReconnectionPlugin<IModbusTcpMaster>, ITcpClosedPlugin
|
||||
{
|
||||
public override Func<IModbusTcpMaster, int, Task<bool?>> ActionForCheck { get; set; }
|
||||
|
||||
public ModbusTcpMasterReconnectionPlugin()
|
||||
{
|
||||
this.ActionForCheck = (c, i) => Task.FromResult<bool?>(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;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -83,7 +83,7 @@ internal class Program
|
||||
.SetRemoteIPHost(new IPHost("127.0.0.1:7789"))
|
||||
.ConfigurePlugins(a =>
|
||||
{
|
||||
a.UseTcpReconnection()
|
||||
a.UseTcpReconnection<TcpClient>()
|
||||
.UsePolling(TimeSpan.FromSeconds(1));
|
||||
})
|
||||
.ConfigureContainer(a =>
|
||||
|
||||
Reference in New Issue
Block a user