diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/MainForm.cs b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/MainForm.cs index a85feb3..3efee52 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/MainForm.cs +++ b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/MainForm.cs @@ -59,8 +59,11 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { this.Hide(); form.ShowDialog(); - this.Show(); - this.Activate(); + if (!this.IsDisposed) + { + this.Show(); + this.Activate(); + } } } diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.Designer.cs b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.Designer.cs index eef4fc1..4b72dd5 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.Designer.cs +++ b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.Designer.cs @@ -792,9 +792,9 @@ // statusStrip1.ImageScalingSize = new Size(24, 24); statusStrip1.Items.AddRange(new ToolStripItem[] { toolStripStatusLabel1 }); - statusStrip1.Location = new Point(0, 382); + statusStrip1.Location = new Point(0, 387); statusStrip1.Name = "statusStrip1"; - statusStrip1.Size = new Size(1114, 31); + statusStrip1.Size = new Size(1114, 26); statusStrip1.TabIndex = 22; statusStrip1.Text = "statusStrip1"; // @@ -802,7 +802,7 @@ // toolStripStatusLabel1.BackColor = Color.Red; toolStripStatusLabel1.Name = "toolStripStatusLabel1"; - toolStripStatusLabel1.Size = new Size(118, 24); + toolStripStatusLabel1.Size = new Size(99, 20); toolStripStatusLabel1.Text = "功率计未连接"; // // uiLabel25 @@ -1554,6 +1554,7 @@ TitleFont = new Font("微软雅黑", 12F, FontStyle.Bold, GraphicsUnit.Point, 134); TitleHeight = 60; ZoomScaleRect = new Rectangle(22, 22, 800, 450); + FormClosing += PrimaryIgnitionForm_FormClosing; FormClosed += PenetrationForm_FormClosed; Load += PenetrationForm_Load; uiTableLayoutPanel1.ResumeLayout(false); diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.cs b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.cs index f64d6eb..623995b 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.cs +++ b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PenetrationForm.cs @@ -62,7 +62,7 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { var timer = new System.Windows.Forms.Timer() { - Interval = 100, + Interval = 200, }; timer.Tick += async (s, e) => { @@ -91,7 +91,7 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { - await WriteDataAsync(); + WriteDataAsync(); } catch { } } @@ -101,7 +101,7 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 } - private async System.Threading.Tasks.Task WriteDataAsync() + private void WriteDataAsync() { try { @@ -110,7 +110,7 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 return; } float value = float.Parse(uiLabel23.Text); - await _modbusMaster.WriteMultipleRegistersAsync(1, 74, c.SplitFloatToUShortArray((float)value)); + _modbusMaster.WriteMultipleRegistersAsync(1, 74, c.SplitFloatToUShortArray((float)value)); //}); } @@ -126,6 +126,11 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { + if (this.IsDisposed || !this.IsHandleCreated) + { + return; + } + if (_modbusMaster == null || _tcpClient == null || !_tcpClient.Connected) { return; @@ -157,6 +162,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 catch (Exception ex) { //ShowError($"读取数据失败:{ex.Message}"); + MessageBox.Show(ex.Message); + } } @@ -166,18 +173,35 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 try { - var modbusMaster = _modbusMaster; - if (modbusMaster == null) return; - - ushort[] registers = await modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length) - .ConfigureAwait(false); - - if (registers == null || registers.Length == 0) + // 简化连接检查 + if (_tcpClient == null || _modbusMaster == null) { - System.Diagnostics.Debug.WriteLine($"读取地址{address}失败:未获取到有效寄存器数据"); return; } + // 检查TCP连接状态(简化版) + bool isConnected = false; + try + { + isConnected = _tcpClient != null && _tcpClient.Connected; + } + catch + { + isConnected = false; + } + + if (!isConnected) + { + // 不再输出调试信息,避免频繁输出 + return; + } + + var modbusMaster = _modbusMaster; + var result = modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length).Result; + ushort[] registers = result; + + if (registers == null || registers.Length == 0) return; + string text; if (registers.Length >= 2 && length >= 2) { @@ -196,20 +220,18 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 UpdateControlText(control, text); } - catch (OperationCanceledException) + catch (Exception ex) when (ex is SocketException || + ex is ObjectDisposedException || + ex is InvalidOperationException || + ex is TimeoutException) { - return; + // 静默处理异常 + Debug.WriteLine($"地址{address}: {ex.GetType().Name}"); } - catch (Exception ex) when (ex is TimeoutException || - ex is InvalidOperationException || - ex.Message.Contains("Modbus", StringComparison.OrdinalIgnoreCase)) + catch (Exception ex) { - Debug.WriteLine($"Modbus通信错误 - 地址{address}: {ex.Message}"); - UpdateControlText(control, "通信错误"); - } - catch (ObjectDisposedException) - { - return; + // 其他异常也静默处理,避免干扰UI + Debug.WriteLine($"地址{address}: {ex.Message}"); } } private void UpdateControlText(Label control, string text) @@ -240,27 +262,32 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { - bool[] registers1 = await Task.Run(async () => - { - if (_modbusMaster == null) - return null; - return await _modbusMaster?.ReadCoilsAsync(1, 4, 1);//是否自熄 - }); + // 修复1:移除 ? 操作符,先检查是否为 null + if (_modbusMaster == null) return; + + bool[] registers1 = await _modbusMaster.ReadCoilsAsync(1, 4, 1); + if (registers1 != null && registers1.Length >= 1) { bool value1 = registers1[0]; - this.Invoke(new Action(() => - { - if (value1) - { - uiLight1.State = UILightState.On; - } - else + // 修复2:添加控件句柄检查 + if (uiLight1.IsDisposed || !uiLight1.IsHandleCreated) + return; + + if (uiLight1.InvokeRequired) + { + uiLight1.Invoke(new Action(() => { - uiLight1.State = UILightState.Off; - } - })); + // 再次检查,防止回调执行时控件已被销毁 + if (!uiLight1.IsDisposed && uiLight1.IsHandleCreated) + uiLight1.State = value1 ? UILightState.On : UILightState.Off; + })); + } + else + { + uiLight1.State = value1 ? UILightState.On : UILightState.Off; + } } } catch (Exception ex) @@ -270,35 +297,38 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 try { - bool[] registers2 = await Task.Run(async () => - { - if (_modbusMaster == null) - return null; - return await _modbusMaster?.ReadCoilsAsync(1, 10, 1);//是否复位 - }); + // 修复3:添加 null 检查 + if (_modbusMaster == null) return; + + bool[] registers2 = await _modbusMaster.ReadCoilsAsync(1, 10, 1);//是否复位 + if (registers2 != null && registers2.Length >= 1) { bool value2 = registers2[0]; - this.Invoke(new Action(() => + + // 修复4:添加控件句柄检查 + if (uiLight3.IsDisposed || !uiLight3.IsHandleCreated) + return; + + if (uiLight3.InvokeRequired) { - if (value2) + uiLight3.Invoke(new Action(() => { - uiLight3.State = UILightState.On; - - - } - else - { - uiLight3.State = UILightState.Off; - } - })); + // 再次检查,防止回调执行时控件已被销毁 + if (!uiLight3.IsDisposed && uiLight3.IsHandleCreated) + uiLight3.State = value2 ? UILightState.On : UILightState.Off; + })); + } + else + { + uiLight3.State = value2 ? UILightState.On : UILightState.Off; + } } } catch (Exception ex) { Debug.WriteLine($"读取状态3失败: {ex.Message}"); } - } private bool _lastRunStatus = false; @@ -307,12 +337,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { - bool[] registers3 = await Task.Run(async () => - { - if (_modbusMaster == null) - return null; - return await _modbusMaster?.ReadCoilsAsync(1, 81, 1); - }); + bool[] registers3 = await _modbusMaster?.ReadCoilsAsync(1, 81, 1); + if (registers3 != null && registers3.Length >= 1) { bool currentRunStatus = registers3[0]; @@ -353,10 +379,15 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 } catch (Exception ex) { + MessageBox.Show(ex.Message); + _readtimer?.Stop(); Debug.WriteLine($"读取状态失败: {ex.Message}"); } //finally { _asyncLock.Release(); } } + + + public async Task ReadModbusCoilAsync(ushort registerAddress, ushort readCount) { if (_modbusMaster == null) return null; @@ -932,7 +963,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - // 跨线程更新UI(异步方法中仍需检查Invoke,避免跨线程异常) + if (uiLabel25.IsDisposed || !uiLabel25.IsHandleCreated) + return; if (uiLabel29.InvokeRequired) { uiLabel29.Invoke(new Action(() => @@ -1076,6 +1108,7 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 private void uiButton1_Click(object sender, EventArgs e) { ma?.BtnClickFunctionForNew(Function.ButtonType.复归型, 80);//开始测试 + } private void uiButton2_Click(object sender, EventArgs e) @@ -1620,5 +1653,16 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { } + + private void PrimaryIgnitionForm_FormClosing(object sender, FormClosingEventArgs e) + { + // 停止定时器 + if (_readtimer != null) + { + _readtimer.Stop(); + _readtimer.Dispose(); + _readtimer = null; + } + } } } diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PrimaryIgnitionForm.cs b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PrimaryIgnitionForm.cs index d6ed78b..c855b0f 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PrimaryIgnitionForm.cs +++ b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/PrimaryIgnitionForm.cs @@ -160,8 +160,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 var modbusMaster = _modbusMaster; if (modbusMaster == null) return; - ushort[] registers = await modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length) - .ConfigureAwait(false); + ushort[] registers = modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length).Result; + if (registers == null || registers.Length == 0) { @@ -231,12 +231,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { - bool[] registers1 = await Task.Run(async () => - { - if (_modbusMaster == null) - return null; - return await _modbusMaster?.ReadCoilsAsync(1, 10, 1); - }); + bool[] registers1 = await _modbusMaster?.ReadCoilsAsync(1, 10, 1); + if (registers1 != null && registers1.Length >= 1) { bool value = registers1[0]; @@ -268,12 +264,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { - bool[] registers2 = await Task.Run(async () => - { - if (_modbusMaster == null) - return null; - return await _modbusMaster?.ReadCoilsAsync(1, 51, 1); - }); + bool[] registers2 = _modbusMaster?.ReadCoilsAsync(1, 51, 1).Result; + if (registers2 != null && registers2.Length >= 1) { diff --git a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/SecondaryIgnitionForm.cs b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/SecondaryIgnitionForm.cs index 3cda07f..055f667 100644 --- a/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/SecondaryIgnitionForm.cs +++ b/外科辅料和患者防护罩激光抗性测试仪/外科辅料和患者防护罩激光抗性测试仪/SecondaryIgnitionForm.cs @@ -113,8 +113,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 var modbusMaster = _modbusMaster; if (modbusMaster == null) return; - ushort[] registers = await modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length) - .ConfigureAwait(false); + ushort[] registers = await modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length); + if (registers == null || registers.Length == 0) { @@ -251,12 +251,8 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 { try { - bool[] registers2 = await Task.Run(async () => - { - if (_modbusMaster == null) - return null; - return await _modbusMaster?.ReadCoilsAsync(1, 301, 1); - }); + bool[] registers2 = await _modbusMaster?.ReadCoilsAsync(1, 301, 1); + if (registers2 != null && registers2.Length >= 1) { bool currentRunStatus = registers2[0]; @@ -298,9 +294,10 @@ namespace 外科辅料和患者防护罩激光抗性测试仪 } catch (Exception ex) { + MessageBox.Show(ex.Message); Debug.WriteLine($"读取状态失败: {ex.Message}"); } - finally { _asyncLock.Release(); } + } public async Task ReadModbusCoilAsync(ushort registerAddress, ushort readCount)