C# 报表查看器在使用X关闭后静默挂起

C# 报表查看器在使用X关闭后静默挂起,c#,visual-studio-2010,memory,printing,C#,Visual Studio 2010,Memory,Printing,更新应用程序似乎不知道打印任务何时完成,并无限期地保持连接打开。有没有办法消除这种联系 当我使用报表查看器调试wpf并打印文档时,似乎无法完全关闭wpf 我按下窗口上的X键,窗口关闭,但vs继续运行。暂停不会显示它挂起的位置,而且wpf中没有任何线程 我们重写了打印以跳过对话框,但在对话框运行后尝试将所有内容设置为null没有帮助。你知道为什么它一直挂着吗?(打印前关闭应用程序效果良好。) 这三个线程仍在工作,有没有办法找出它们为什么保持打开状态 未延迟的1424 7工作线程vshost.Run

更新应用程序似乎不知道打印任务何时完成,并无限期地保持连接打开。有没有办法消除这种联系

当我使用报表查看器调试wpf并打印文档时,似乎无法完全关闭wpf

我按下窗口上的X键,窗口关闭,但vs继续运行。暂停不会显示它挂起的位置,而且wpf中没有任何线程

我们重写了打印以跳过对话框,但在对话框运行后尝试将所有内容设置为null没有帮助。你知道为什么它一直挂着吗?(打印前关闭应用程序效果良好。)

这三个线程仍在工作,有没有办法找出它们为什么保持打开状态

未延迟的1424 7工作线程vshost.RunParkingWindow[管理到本机转换]正常

        protected override void OnPrintCommand()
    {
        PrintDialog printDialog = new PrintDialog();
        printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
        printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;

        FixedDocument fixedDocument = this.Document as FixedDocument;               
        FixedDocumentSequence fixedDocumentSequence = this.Document as FixedDocumentSequence;               
        if (fixedDocument != null) fixedDocument.PrintTicket = printDialog.PrintTicket;               
        if (fixedDocumentSequence!= null) fixedDocumentSequence.PrintTicket = printDialog.PrintTicket;               

        XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);              
        if (fixedDocument != null) writer.WriteAsync(fixedDocument, printDialog.PrintTicket);               
        if (fixedDocumentSequence != null) writer.WriteAsync(fixedDocumentSequence, printDialog.PrintTicket);

        printDialog = null;
        fixedDocument = null;
        fixedDocumentSequence = null;
        writer = null;
    }
未延迟的4320 8工作线程.NET SystemEvents[管理到本机转换]正常

        protected override void OnPrintCommand()
    {
        PrintDialog printDialog = new PrintDialog();
        printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
        printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;

        FixedDocument fixedDocument = this.Document as FixedDocument;               
        FixedDocumentSequence fixedDocumentSequence = this.Document as FixedDocumentSequence;               
        if (fixedDocument != null) fixedDocument.PrintTicket = printDialog.PrintTicket;               
        if (fixedDocumentSequence!= null) fixedDocumentSequence.PrintTicket = printDialog.PrintTicket;               

        XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);              
        if (fixedDocument != null) writer.WriteAsync(fixedDocument, printDialog.PrintTicket);               
        if (fixedDocumentSequence != null) writer.WriteAsync(fixedDocumentSequence, printDialog.PrintTicket);

        printDialog = null;
        fixedDocument = null;
        fixedDocumentSequence = null;
        writer = null;
    }
未延迟>4332 9主线程主线程[管理到本机转换]正常

        protected override void OnPrintCommand()
    {
        PrintDialog printDialog = new PrintDialog();
        printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
        printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;

        FixedDocument fixedDocument = this.Document as FixedDocument;               
        FixedDocumentSequence fixedDocumentSequence = this.Document as FixedDocumentSequence;               
        if (fixedDocument != null) fixedDocument.PrintTicket = printDialog.PrintTicket;               
        if (fixedDocumentSequence!= null) fixedDocumentSequence.PrintTicket = printDialog.PrintTicket;               

        XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);              
        if (fixedDocument != null) writer.WriteAsync(fixedDocument, printDialog.PrintTicket);               
        if (fixedDocumentSequence != null) writer.WriteAsync(fixedDocumentSequence, printDialog.PrintTicket);

        printDialog = null;
        fixedDocument = null;
        fixedDocumentSequence = null;
        writer = null;
    }

当您在不调试的情况下运行它时,它是否也会这样做?调用writer.WriteAsync(),是否可能在尝试关闭应用程序时它仍在写入

您可能应该连接一个事件以完成writeasync方法。有关将XpsDocumentWriter与WritingCompleted回调一起使用的非常好的示例,请参阅链接


尽管扩展阻止了文档查看器弹出,但报告在后台仍处于活动状态

解决方案很简单,不是抑制查看器,而是打印文档,然后关闭查看器。您还可以选择在关闭查看器之前隐藏它


此修复后,应用程序将自动关闭。

使用“调试+全部中断”、“调试+Windows+线程”并找出您看到的线程正在执行的操作。您可能有一些未设置为后台线程的延迟线程,这些线程使进程执行保持活动状态,如果你有任何自定义线程,我会使用Hans技术查看。我已经检查了线程。有三个仍然在运行,我更新了问题,但我自己没有创建任何线程,所以我不确定如何找到我可以对它们做些什么。