C# 在Windows 8.1中打印WPF FixedPage时引用为空
我有一个.net framework v4.7.2 WPF应用程序,它打印一个C# 在Windows 8.1中打印WPF FixedPage时引用为空,c#,wpf,windows,C#,Wpf,Windows,我有一个.net framework v4.7.2 WPF应用程序,它打印一个FixedPage,在Windows 7上运行时没有出现任何问题,但在Windows 8.1上运行时遇到了一些问题 以下代码块是导致故障的原因: private void Print() { 使用(var printQueue=LocalPrintServer.GetDefaultPrintQueue()) { var printTicket=printQueue.DefaultPrintTicket; var wri
FixedPage
,在Windows 7上运行时没有出现任何问题,但在Windows 8.1上运行时遇到了一些问题
以下代码块是导致故障的原因:
private void Print()
{
使用(var printQueue=LocalPrintServer.GetDefaultPrintQueue())
{
var printTicket=printQueue.DefaultPrintTicket;
var writer=PrintQueue.CreateXpsDocumentWriter(PrintQueue);
writer.WritingCompleted+=OnDocumentWrited;
writer.WriteAsync(View.LabelPageView.AddressLabelPage,printTicket);
}
}
它抛出带有以下堆栈跟踪的NullReferenceException
:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Collections.Hashtable.get_Item(Object key)
at System.Printing.PrintQueue.get_IsXpsDevice()
at System.Printing.PrintQueue.ForwardXpsDriverDocEvent(Object sender, XpsSerializationXpsDriverDocEventArgs args)
at System.Windows.Xps.Serialization.XpsSerializationManager.OnXpsDriverDocEvent(XpsSerializationXpsDriverDocEventArgs e)
at System.Windows.Xps.Serialization.XpsDriverDocEventManager.OnXpsDriverDocEvent()
at System.Windows.Xps.Serialization.XpsDriverDocEventManager.ForwardPackagingProgressEvent(Object sender, PackagingProgressEventArgs e)
at System.Windows.Xps.Packaging.PackagingProgressEventHandler.Invoke(Object sender, PackagingProgressEventArgs e)
at System.Windows.Xps.Packaging.XpsInterleavingPolicy.AddItem(INode n, Int32 number, INode parent)
at System.Windows.Xps.Serialization.XpsPackagingPolicy.AcquireXmlWriterForFixedPage()
at System.Windows.Xps.Serialization.XpsSerializationManager.AcquireXmlWriter(Type writerType)
at System.Windows.Xps.Serialization.FixedPageSerializerAsync.get_XmlWriter()
at System.Windows.Xps.Serialization.ReachTreeWalker..ctor(ReachSerializer serializer)
at System.Windows.Xps.Serialization.FixedPageSerializerAsync.PersistObjectData(SerializableObjectContext serializableObjectContext)
at System.Windows.Xps.Serialization.ReachSerializerAsync.BeginSerializeObject(Object serializedObject)
at System.Windows.Xps.Serialization.FixedPageSerializerAsync.SerializeObject(Object serializedObject)
at System.Windows.Xps.Serialization.XpsSerializationManagerAsync.InvokeSaveAsXamlWorkItem(Object arg)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
如果我用writer.Write(…)
替换writer.Write(…)
则错误消失
我已经能够在Windows 8.1、Windows Server 2012 R2和Windows Server 2016上重现该错误。我无法在Windows 10上重现该错误
有关如何在Windows 8.1上异步打印的任何建议?您可以使该方法
异步
,然后等待
异步调用
试试这个:
private async Task Print()
{
using (var printQueue = LocalPrintServer.GetDefaultPrintQueue())
{
var printTicket = printQueue.DefaultPrintTicket;
var writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
writer.WritingCompleted += OnDocumentWritten;
await writer.WriteAsync(View.LabelPageView.AddressLabelPage, printTicket);
}
}
@rene的回答解决了这个问题,所以问题显然是打印队列在打印完成之前就被处理掉了
private void Print()
{
var printQueue=LocalPrintServer.GetDefaultPrintQueue()
var printTicket=printQueue.DefaultPrintTicket;
var writer=PrintQueue.CreateXpsDocumentWriter(PrintQueue);
writer.WritingCompleted+=OnDocumentWrited;
writer.WriteAsync(View.LabelPageView.AddressLabelPage,printTicket);
}
然而,代码在Windows 10上运行,而不是在Windows 8.1上运行,这似乎有些奇怪。您可能需要保持对printQueue中该实例的引用处于活动状态,或者至少在打印完成之前不要调用Dispose。看起来您可以将处理延迟到OnDocumentWrite方法。可能重复的@rene操作是在
using
块中使用异步方法,而不等待它