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