优化RealTimeImage属性的线程安全性:1. 为get访问器添加线程安全检查 2. 提取SetRealTimeImageInternal内部方法处理实际设置逻辑 3. 改进异常处理和资源管理
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user