using Microsoft.AspNetCore.SignalR.Client; namespace EEMSClientCore; public partial class ClientCaller(IClientBaseProvider baseProvider) : IDisposable { private IClientProvider? _clientProvider; private HubConnection? _HubConnection; public bool Initialize() { if (_HubConnection is not null) return false; if (_clientProvider is not null) return false; this._clientProvider = new ClientProvider(this, baseProvider); return true; } public bool Open(string ip, int port, string hub, int retry = 40) { if (_clientProvider is null) return false; HubConnection temp = new HubConnectionBuilder() .WithUrl($"http://{ip}:{port}/{hub}") .WithAutomaticReconnect() .Build(); temp.On("RequestFile", _clientProvider.RequestFile); temp.On("PushFile", _clientProvider.PushFile); for (int i = 1; i <= retry; i++) { try { temp.StartAsync().Wait(); _HubConnection = temp; break; } catch { if (i == retry) return false; Thread.Sleep(1000); } } return true; } protected bool CheckConnect() { if (_HubConnection is null) return false; if (_HubConnection.State != HubConnectionState.Connected) return false; return true; } protected async Task Send(string name) { if (!CheckConnect()) return false; try { await _HubConnection!.SendAsync(name); } catch { return false; } return true; } protected async Task Send(string name, T1 para1) { if (!CheckConnect()) return false; try { await _HubConnection!.SendAsync(name, para1); } catch { return false; } return true; } protected async Task Send(string name, T1 para1, T2 para2) { if (!CheckConnect()) return false; try { await _HubConnection!.SendAsync(name, para1, para2); } catch { return false; } return true; } protected async Task Send(string name, T1 para1, T2 para2, T3 para3) { if (!CheckConnect()) return false; try { await _HubConnection!.SendAsync(name, para1, para2, para3); } catch { return false; } return true; } protected async Task Send(string name, T1 para1, T2 para2, T3 para3, T4 para4) { if (!CheckConnect()) return false; try { await _HubConnection!.SendAsync(name, para1, para2, para3, para4); } catch { return false; } return true; } protected bool Invoke(string name, out T_Return? returnValue) { returnValue = default; if (!CheckConnect()) return false; try { returnValue = _HubConnection!.InvokeAsync(name).Result; } catch { return false; } return true; } protected bool Invoke(string name, T_para1 para1, out T_Return? returnValue) { returnValue = default; if (!CheckConnect()) return false; try { returnValue = _HubConnection!.InvokeAsync(name, para1).Result; } catch { return false; } return true; } protected bool Invoke(string name, T_para1 para1, T_Para2 para2, out T_Return? returnValue) { returnValue = default; if (!CheckConnect()) return false; try { returnValue = _HubConnection!.InvokeAsync(name, para1, para2).Result; } catch { return false; } return true; } protected bool Invoke(string name, T_para1 para1, T_Para2 para2, T_Para3 para3, out T_Return? returnValue) { returnValue = default; if (!CheckConnect()) return false; try { returnValue = _HubConnection!.InvokeAsync(name, para1, para2, para3).Result; } catch { return false; } return true; } public void Dispose() { _HubConnection?.StopAsync().Wait(); _HubConnection = null; this._clientProvider = null; } }