From dfca0b470c282e54570c1cafb95951bbfb97b2e6 Mon Sep 17 00:00:00 2001 From: zqm Date: Thu, 6 Nov 2025 11:07:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4RealTimeImage=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=9A=84=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=9A=E4=BD=9C=E4=B8=BA=E5=90=8E=E5=8F=B0=E5=8F=98?= =?UTF-8?q?=E9=87=8F=EF=BC=8C=E4=B8=8D=E7=9B=B4=E6=8E=A5=E6=93=8D=E4=BD=9C?= =?UTF-8?q?UI=EF=BC=8C=E7=A7=BB=E9=99=A4InvokeRequired=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BB=A5=E7=AE=80=E5=8C=96=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=B9=B6=E6=8F=90=E9=AB=98=E6=80=A7=E8=83=BD=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E7=8A=B6=E6=80=81=E6=A3=80=E6=9F=A5=E5=92=8C=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E7=AE=A1=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CS/Framework4.0/Toprie/Toprie/Setting.cs | 83 ++++++------------- 1 file changed, 27 insertions(+), 56 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs index 2f42487..b0b1813 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/Setting.cs @@ -102,76 +102,47 @@ namespace JoyD.Windows.CS private Image mRealTimeImage = null; /// /// 实时图像属性 + /// 作为后台变量,移除线程安全检查以提高性能 + /// 注意:调用方需确保在合适的线程上下文中访问 /// public Image RealTimeImage { get { - // 读取操作也需要线程安全检查 - if (this.InvokeRequired) - { - return (Image)this.Invoke(new Func(() => mRealTimeImage)); - } return mRealTimeImage; } set { - // 线程安全检查 - 确保在UI线程上执行 - if (this.InvokeRequired) + // 防止重复设置相同的图像 + if (mRealTimeImage == value) + return; + + // 检查是否在有效状态下操作 + if (this.IsDisposed || this.Disposing) { - try - { - // 使用Action委托设置值,避免闭包问题 - this.BeginInvoke(new Action(SetRealTimeImageInternal), value); - } - catch (ObjectDisposedException) - { - // 控件已释放,释放传入的图像资源 - value?.Dispose(); - } + // 如果窗口已关闭或正在关闭,释放传入的图像 + value?.Dispose(); return; } - // 在UI线程上直接调用内部方法 - SetRealTimeImageInternal(value); + // 释放旧图像资源 + if (mRealTimeImage != null && mRealTimeImage != value) + { + try + { + mRealTimeImage.Dispose(); + } + catch (Exception ex) + { + // 记录异常但不中断流程 + System.Diagnostics.Debug.WriteLine($"释放旧图像资源失败: {ex.Message}"); + } + } + + // 只设置mRealTimeImage,不直接更新UI + // UI更新将由定时器的Timer_Tick事件处理 + mRealTimeImage = value; } } - - /// - /// 内部方法,在UI线程上安全地设置实时图像 - /// - /// 要设置的新图像 - private void SetRealTimeImageInternal(Image value) - { - // 防止重复设置相同的图像 - if (mRealTimeImage == value) - return; - - // 检查是否在有效状态下操作 - if (this.IsDisposed || this.Disposing) - { - // 如果窗口已关闭或正在关闭,释放传入的图像 - value?.Dispose(); - return; - } - - // 释放旧图像资源 - if (mRealTimeImage != null && mRealTimeImage != value) - { - try - { - mRealTimeImage.Dispose(); - } - catch (Exception ex) - { - // 记录异常但不中断流程 - System.Diagnostics.Debug.WriteLine($"释放旧图像资源失败: {ex.Message}"); - } - } - - // 只设置mRealTimeImage,不直接更新UI - // UI更新将由定时器的Timer_Tick事件处理 - mRealTimeImage = value; - } } }