使用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
相关产品推荐
相关产品推荐

