优化RealTimeImage属性的线程安全性:1. 为get访问器添加线程安全检查 2. 提取SetRealTimeImageInternal内部方法处理实际设置逻辑 3. 改进异常处理和资源管理

This commit is contained in:
zqm
2025-11-06 11:03:30 +08:00
parent 05bd08647c
commit 8917403659

View File

@@ -107,6 +107,11 @@ namespace JoyD.Windows.CS
{ {
get get
{ {
// 读取操作也需要线程安全检查
if (this.InvokeRequired)
{
return (Image)this.Invoke(new Func<Image>(() => mRealTimeImage));
}
return mRealTimeImage; return mRealTimeImage;
} }
set set
@@ -116,16 +121,28 @@ namespace JoyD.Windows.CS
{ {
try try
{ {
this.BeginInvoke(new Action<Image>((img) => RealTimeImage = img), value); // 使用Action委托设置值避免闭包问题
this.BeginInvoke(new Action<Image>(SetRealTimeImageInternal), value);
} }
catch (ObjectDisposedException) catch (ObjectDisposedException)
{ {
// 控件已释放,释放传入的图像 // 控件已释放,释放传入的图像资源
value?.Dispose(); value?.Dispose();
} }
return; return;
} }
// 在UI线程上直接调用内部方法
SetRealTimeImageInternal(value);
}
}
/// <summary>
/// 内部方法在UI线程上安全地设置实时图像
/// </summary>
/// <param name="value">要设置的新图像</param>
private void SetRealTimeImageInternal(Image value)
{
// 防止重复设置相同的图像 // 防止重复设置相同的图像
if (mRealTimeImage == value) if (mRealTimeImage == value)
return; return;
@@ -138,10 +155,18 @@ namespace JoyD.Windows.CS
return; return;
} }
// 释放旧图像 // 释放旧图像资源
if (mRealTimeImage != null && mRealTimeImage != value) if (mRealTimeImage != null && mRealTimeImage != value)
{ {
try { mRealTimeImage.Dispose(); } catch { } try
{
mRealTimeImage.Dispose();
}
catch (Exception ex)
{
// 记录异常但不中断流程
System.Diagnostics.Debug.WriteLine($"释放旧图像资源失败: {ex.Message}");
}
} }
// 只设置mRealTimeImage不直接更新UI // 只设置mRealTimeImage不直接更新UI
@@ -149,5 +174,4 @@ namespace JoyD.Windows.CS
mRealTimeImage = value; mRealTimeImage = value;
} }
} }
}
} }