You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AdvancedSharpAdbClient截图报错:缓冲区与池不关联

解决AdvancedSharpAdbClient截图时的缓冲区池异常问题

问题场景

使用AdvancedSharpAdbClient库执行设备截图时,调用官方示例代码出现异常:

System.ArgumentException: 缓冲区与该池无关,无法返回给它。(参数“array”)

示例代码如下:

private static AdbClient client = new AdbClient();
public Bitmap Screenshot()
{
    Image i = client.GetFrameBufferAsync(device, CancellationToken.None).GetAwaiter().GetResult();
    return (Bitmap)i;
}

解决方案

方案1:改用异步调用模式

避免同步阻塞异步方法,将方法改为异步并复制图像内容:

private static AdbClient client = new AdbClient();
public async Task<Bitmap> ScreenshotAsync()
{
    using Image frameBufferImage = await client.GetFrameBufferAsync(device, CancellationToken.None);
    // 复制图像内容,脱离原内存池缓冲区
    return new Bitmap(frameBufferImage);
}

方案2:同步调用时手动复制图像

如果必须使用同步调用,通过Graphics绘制的方式复制图像数据:

private static AdbClient client = new AdbClient();
public Bitmap Screenshot()
{
    using Image frameBufferImage = client.GetFrameBufferAsync(device, CancellationToken.None).GetAwaiter().GetResult();
    Bitmap resultBitmap = new Bitmap(frameBufferImage.Width, frameBufferImage.Height);
    using (Graphics g = Graphics.FromImage(resultBitmap))
    {
        g.DrawImage(frameBufferImage, new Rectangle(0, 0, resultBitmap.Width, resultBitmap.Height));
    }
    return resultBitmap;
}

原因说明

异常源于GetFrameBufferAsync返回的Image对象依赖共享内存池管理缓冲区,同步阻塞调用(GetAwaiter().GetResult())会打乱内存池的生命周期管理,直接强制转换Bitmap会导致后续缓冲区回收时出现池不匹配的问题。通过复制图像内容生成独立的Bitmap,即可脱离原内存池的关联,避免异常。

内容的提问来源于stack exchange,提问作者Alfonzo Lori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:45:34