优化UpdateImageOnUI方法,消除冗余逻辑:1. 将控件状态检查移到方法开始处,避免重复检查;2. 合并_imageBuffer的锁操作,减少锁竞争;3. 创建统一的DisposeImage辅助方法处理图像资源释放;4. 预定义displayImage变量以提高代码可读性
This commit is contained in:
@@ -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 { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user