diff --git a/Class/AsyncTcpServer.cs b/Class/AsyncTcpServer.cs index b184ad8..221a755 100644 --- a/Class/AsyncTcpServer.cs +++ b/Class/AsyncTcpServer.cs @@ -4,6 +4,7 @@ using System.Data; using System.Security.Cryptography.Pkcs; using System.Text; using System.Text.Json; +using System.Threading.Channels; using System.Windows; using System.Windows.Markup; using System.Xml.Linq; @@ -38,17 +39,17 @@ namespace ForwardingServerUI.Class //离线记录 Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] NOT ID " + client.Id + " IP " + client.IP); - - DataRow row = MainWindowViewModel._machineTable.Select("ID='" + client.Id + "'").First(); - - Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] BREAK LINK ID = " + - row["ID"] + " IP = " + row["IP"] + " Enterprise = " + row["Enterprise"] + - " MachineName = " + row["MachineName"]); - Application.Current.Dispatcher.Invoke(() => { + DataRow row = MainWindowViewModel._machineTable.Select("ID='" + client.Id + "'").First(); + + Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] BREAK LINK ID = " + + row["ID"] + " IP = " + row["IP"] + " Enterprise = " + row["Enterprise"] + + " MachineName = " + row["MachineName"]); + MainWindowViewModel._machineTable.Rows.Remove(row); }); + return EasyTask.CompletedTask; };//有客户端断开连接 service.Received = (client, e) =>{ @@ -162,43 +163,49 @@ namespace ForwardingServerUI.Class { try { - int rows = MainWindowViewModel._machineTable.Rows.Count; - for (int i = rows; i > 0; i--) - { - DataRow dataRow = MainWindowViewModel._machineTable.Rows[i-1]; - DateTime dateTime = DateTime.Parse(dataRow["HeartbeatTime"].ToString()!); + DataRow[] row = MainWindowViewModel._machineTable.Select("HeartbeatTime<'" + DateTime.Now.AddSeconds(-30).ToString() + "'"); - if (DateTime.Now > dateTime.AddSeconds(30) && (int)dataRow["Start"] == 30) + Application.Current.Dispatcher.Invoke(() => + { + foreach (var dataRow in row) { - Application.Current.Dispatcher.Invoke(() => + if ((int)dataRow["Start"] == 30) { dataRow.BeginEdit(); dataRow["Start"] = 999; dataRow.EndEdit(); dataRow.AcceptChanges(); - }); - Console.WriteLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] NOT LINK ID = " + - dataRow["ID"] + " IP = " + dataRow["IP"] + " Enterprise = " + dataRow["Enterprise"] + - " MachineName = " + dataRow["MachineName"]); + Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] NOT LINK ID = {dataRow["ID"]} " + + $"IP = {dataRow["IP"]} Enterprise = {dataRow["Enterprise"]} " + + $"MachineName = {dataRow["MachineName"]}"); + } } + }); - if (DateTime.Now > dateTime.AddSeconds(180)) + DataRow[] rowout = MainWindowViewModel._machineTable.Select("HeartbeatTime<'" + DateTime.Now.AddSeconds(-120).ToString() + "'"); + + Application.Current.Dispatcher.Invoke(() => + { + foreach (var dataRow in rowout) { - //关闭无回应连接 + dataRow.BeginEdit(); + dataRow["Start"] = 999; + dataRow.EndEdit(); + dataRow.AcceptChanges(); + foreach (var item in service.Clients) { if (item.Id == dataRow["ID"].ToString()) { - await item.CloseAsync(); - - //在断开连接后,释放对象。 - item.Dispose(); + item.CloseAsync(); // 关闭完成 + item.Dispose(); // 释放资源 + break; } } } - - } + }); + } catch (Exception ex) { @@ -206,6 +213,6 @@ namespace ForwardingServerUI.Class LogGing.ERRDATA(ex); } } - + } } diff --git a/MainWindowViewModel.cs b/MainWindowViewModel.cs index 9c8b36e..7a8f645 100644 --- a/MainWindowViewModel.cs +++ b/MainWindowViewModel.cs @@ -26,6 +26,8 @@ namespace ForwardingServerUI [ObservableProperty] public static DataTable _userTable = new(); + public static readonly object TableLock = new object(); + public async void Data() { _machineTable.Columns.Add("ID", typeof(string));