优化UpdateImageOnUI方法,消除冗余逻辑:1. 将控件状态检查移到方法开始处,避免重复检查;2. 合并_imageBuffer的锁操作,减少锁竞争;3. 创建统一的DisposeImage辅助方法处理图像资源释放;4. 预定义displayImage变量以提高代码可读性

This commit is contained in:
zqm
2025-10-30 14:46:29 +08:00
parent ba255790f9
commit b3a747aa06

View File

@@ -134,7 +134,6 @@ namespace JoyD.Windows.CS.Toprie
else if (isPingFailed || isDisconnected || isReconnecting)
{
// 非暂停状态下检查Ping状态和连接状态
_infoImage = new Bitmap(BUFFER_WIDTH, BUFFER_HEIGHT);
using (Graphics g = Graphics.FromImage(_infoImage))
{
// 设置半透明背景
@@ -646,15 +645,20 @@ namespace JoyD.Windows.CS.Toprie
return;
}
// 一次性控件有效性检查,避免重复检查
if (this.IsDisposed || imageBox == null || imageBox.IsDisposed)
{
Console.WriteLine("控件已释放,无法更新图像");
return;
}
Image lastImage = null;
Image infoImage = null;
Image oldImage = null;
Bitmap displayImage = null;
try
{
// 移除连接状态检查确保在任何状态下都能更新UI
// 根据流程要求需要在断开或Ping不通时也能显示相关信息
// 检查图像缓冲区是否有效
if (_imageBuffer == null)
{
@@ -667,13 +671,6 @@ namespace JoyD.Windows.CS.Toprie
}
}
// 更新图像前先检查控件是否存在/已释放
if (this.IsDisposed || imageBox == null || imageBox.IsDisposed)
{
Console.WriteLine("控件已释放,无法更新图像");
return;
}
// 保存旧图像引用,以便在设置新图像后释放
oldImage = imageBox.Image;
@@ -695,7 +692,7 @@ namespace JoyD.Windows.CS.Toprie
}
}
// 在缓冲区上绘制图像 - 按照用户要求的步骤执行
// 合并锁定,减少锁的数量,提高性能
lock (_imageBuffer)
{
using (Graphics g = Graphics.FromImage(_imageBuffer))
@@ -731,12 +728,8 @@ namespace JoyD.Windows.CS.Toprie
}
}
}
}
// 步骤3创建缓冲区的副本用于显示避免在显示时锁定缓冲区
Bitmap displayImage = null;
lock (_imageBuffer)
{
// 在同一个锁内创建缓冲区的副本,避免重复锁定
displayImage = (Bitmap)_imageBuffer.Clone();
}
@@ -753,8 +746,8 @@ namespace JoyD.Windows.CS.Toprie
// 特别处理"参数无效"异常
Console.WriteLine($"图像参数无效异常: {ex.Message}");
// 尝试设置旧图像回来,如果可能的话
if (oldImage != null && !this.IsDisposed && imageBox != null && !imageBox.IsDisposed)
// 尝试设置旧图像回来,不需要再次检查控件状态(已在方法开始处检查)
if (oldImage != null)
{
try
{
@@ -763,7 +756,7 @@ namespace JoyD.Windows.CS.Toprie
catch
{
// 如果设置旧图像也失败,释放它
try { oldImage.Dispose(); } catch {}
DisposeImage(oldImage);
}
}
}
@@ -774,9 +767,24 @@ namespace JoyD.Windows.CS.Toprie
finally
{
// 确保在任何情况下都释放资源
if (lastImage != null) { try { lastImage.Dispose(); } catch { } }
if (infoImage != null) { try { infoImage.Dispose(); } catch { } }
if (oldImage != null && oldImage != imageBox.Image) { try { oldImage.Dispose(); } catch { } }
DisposeImage(lastImage);
DisposeImage(infoImage);
// 只有当旧图像不再被使用时才释放
if (oldImage != null && oldImage != imageBox.Image)
{
DisposeImage(oldImage);
}
}
}
/// <summary>
/// 安全释放图像资源的辅助方法
/// </summary>
private void DisposeImage(Image image)
{
if (image != null)
{
try { image.Dispose(); } catch { }
}
}