Windows phone BitmapEncoder FlushAsync()永远不会返回

Windows phone BitmapEncoder FlushAsync()永远不会返回,windows-phone,win-universal-app,Windows Phone,Win Universal App,我已经在网上搜索过了,但还没有找到解决方案。我的通用手机应用程序中有一个DispatchTimer。在每个刻度上,我想捕获屏幕的一部分并将其保存为JPEG格式。我的代码看起来非常简单,并且没有崩溃——它根本不会从FlushAsync()返回。看起来这一定是一个死锁场景,但我还没有找到冲突的位置: using (var ms = new MemoryStream()) { var renderTargetBitmap = new RenderTargetBitmap(); awai

我已经在网上搜索过了,但还没有找到解决方案。我的通用手机应用程序中有一个DispatchTimer。在每个刻度上,我想捕获屏幕的一部分并将其保存为JPEG格式。我的代码看起来非常简单,并且没有崩溃——它根本不会从FlushAsync()返回。看起来这一定是一个死锁场景,但我还没有找到冲突的位置:

using (var ms = new MemoryStream())
{
    var renderTargetBitmap = new RenderTargetBitmap();
    await renderTargetBitmap.RenderAsync(ctrl);
    var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();

    using (var ras = ms.AsRandomAccessStream())
    {
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras, propertySet);

        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Premultiplied,
            (uint) renderTargetBitmap.PixelWidth,
            (uint) renderTargetBitmap.PixelHeight,
            logicalDpi, logicalDpi,
            pixelBuffer.ToArray());

        await encoder.FlushAsync();
    }

    return ms.ToArray();
}

任何帮助都会很好!我已经做了好几个小时了,试着用不同的方法让它工作,但没有运气。

我找到了答案!事实证明,您不能仅使用MemoryStream.AsRandomAccessStream()作为编码器目标。事实证明,您应该只使用InMemoryRandomAccessStream,然后获取字节:

byte[] bytes = new byte[ras.Size];
await ras.AsStream().ReadAsync(bytes, 0, bytes.Length);
return bytes;

不确定MemoryStream为什么会导致问题,但这是一个非常简单的解决方法!我希望这能帮助其他人。

我也有同样的问题。你能分享你问题中的代码片段吗。我不明白在哪里使用字节数组。BitmapEncoder.CreateAsync()接收字节数组而不是随机访问流时没有重载。抱歉,时间太久了。查看初始代码段,您似乎有三个更改:1。将AsRandomAccessStream更改为.AsInMemoryRandomAccessStream 2。在“using”块的末尾插入带有字节数组3的代码块。只需删除最终返回(在使用块之后),因为它不再被使用。这是很久以前的事了,我还没有100%的信心,所以试试吧。你救了我的命!谢谢很高兴它帮助了@demonplus!