由于UWP PdfDocument,WPF应用程序未退出

时间:2018-06-19 14:18:39

标签: c# wpf windows-runtime desktop-bridge

我正在尝试从WPF-Desktop应用程序使用UWP Windows.Data.Pdf API。它可以将PDF页面呈现为PNG图像。

我的问题是执行PDF渲染后,关闭WPF-Window不再退出应用程序。该过程一直在运行。我曾尝试在这种状态下在调试器中暂停应用程序,但似乎没有应用程序代码正在运行。我猜有些线程或资源必须仍然打开。

我的问题是,有人知道为什么会这样吗?而且,我该如何调试此类问题?

使用VS17中的空白WPF模板可以重现此问题,我已将其添加到.csproj:

<TargetPlatformVersion>10.0.16299.0</TargetPlatformVersion>
...
<Reference Include="System.Runtime.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>$(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll</HintPath>
</Reference>
<Reference Include="Windows">
  <HintPath>$(MSBuildProgramFiles32)\Windows Kits\10\UnionMetadata\10.0.16299.0\Windows.winmd</HintPath>
</Reference>

通过一个简单的按钮,我正在执行以下代码:

using System;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Data.Pdf;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
...
var filename = @"C:\Users\...\a.pdf"
var f = await StorageFile.GetFileFromPathAsync(filename);
byte[] content;
using (var stream = await f.OpenReadAsync())
{
    var d = await PdfDocument.LoadFromStreamAsync(stream);
    using (var page0 = d.GetPage(0))
    {
        await page0.PreparePageAsync();
        using (var randomAccessStream = new InMemoryRandomAccessStream())
        {
            await page0.RenderToStreamAsync(randomAccessStream, new PdfPageRenderOptions { BitmapEncoderId = BitmapEncoder.PngEncoderId });
            content = new byte[randomAccessStream.Size];
            await randomAccessStream.ReadAsync(content.AsBuffer(), (uint)randomAccessStream.Size, InputStreamOptions.None);
        }
    }
}
File.WriteAllBytes(@"C:\Users\...\b.png", content);

这几乎是整个代码,但是如果我错过了某些内容,我也会将其推送到https://github.com/marv51/PDFRendererNotExiting

非常感谢您在此方面的任何帮助。

更新:

我刚刚观察到,该过程最终会在大约2分钟后退出! 大概相关,我在事件查看器中找到了:

Faulting application name: WpfApp3.exe, version: 1.0.0.0, time stamp: 0x5b291e3a
Faulting module name: ntdll.dll, version: 10.0.17134.1000, time stamp: 0xcfe5bd82
Exception code: 0xc0000005
Fault offset: 0x000420c8
Faulting process id: 0x1ee0
Faulting application start time: 0x01d407e07f1c3295
Faulting application path: C:\Users\ruehe\source\repos\WpfApp3\WpfApp3\bin\Release\WpfApp3.exe
Faulting module path: C:\WINDOWS\SYSTEM32\ntdll.dll
Report Id: 3a51f5ff-52b3-47fb-b00d-bf002f932c41
Faulting package full name: 
Faulting package-relative application ID: 

因此,我假设终止期间某些后台线程崩溃了,并且Windows错误报告使该过程保持活动状态以收集信息。还是某种超时会杀死开放资源?

对不起,我刚刚找到了这个。我可以使用此崩溃信息做任何事情吗?

更新2

花了很多时间并学习了一些windbg之后,我认为这可能是Nvidia图形驱动程序崩溃:

附加到应用程序然后关闭窗口会显示此异常:

(2134.1cac): Unknown exception - code 0000071a (first chance)
(2134.1cac): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispi.inf_amd64_040c7acb04cee565\nvwgf2um.dll - 
eax=00000000 ebx=0be09f10 ecx=00000013 edx=00000000 esi=00000000 edi=00000030
eip=779f38e8 esp=007decd0 ebp=007ded10 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210246
ntdll!RtlFreeHeap+0x28:
779f38e8 817e08eeddeedd  cmp     dword ptr [esi+8],0DDEEDDEEh ds:002b:00000008=????????

我在此处发布了analyze -v输出:https://gist.github.com/Marv51/d3ad0e9a49b6c985d9116600fd0475b7

通过查看堆栈跟踪,我相信内部类Windows.Data.Pdf.CPdfStatics的析构函数会尝试释放一些DirectX资源,并且Nvidia驱动程序在此过程中会破坏堆。

我尝试更新到最新的Nvidia驱动程序,但没有改变。

不确定从这里可以去哪里。我仍然是windbg初学者,所以我可能会将此输出解释为错误。

也许现在的“解决方案”是我将在外部流程中进行这项工作,以避免这些问题“感染”主应用程序。

0 个答案:

没有答案