我有一个.net框架v4.7.2WPF应用程序,它打印了在Windows7上运行没有任何问题的FixedPage,但在Windows8.1上运行它时遇到了一些问题。
下面的代码块是导致问题的原因:
private void Print()
{
using (var printQueue = LocalPrintServer.GetDefaultPrintQueue())
{
var printTicket = printQueue.DefaultPrintTicket;
var writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
writer.WritingCompleted += OnDocumentWritten;
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.WriteAsync(...),这个错误就会消失。
我已经能够在Windows8.1、Windows Server2012 R2和Windows Server2016上重现该错误。我无法在Windows 10上重现该错误。
对如何在Windows 8.1上异步打印有什么建议吗?
发布于 2019-03-25 15:37:32
@rene的回答解决了这个问题,所以很明显,问题是PrintQueue在打印完成之前就被处理了。
private void Print()
{
var printQueue = LocalPrintServer.GetDefaultPrintQueue()
var printTicket = printQueue.DefaultPrintTicket;
var writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
writer.WritingCompleted += OnDocumentWritten;
writer.WriteAsync(View.LabelPageView.AddressLabelPage, printTicket);
}然而,代码在Windows10上运行,而不是Windows8.1,这看起来确实很奇怪。
发布于 2019-03-22 23:30:32
您可以将方法设为async,然后使用await进行异步调用。
试试这个:
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);
}
}https://stackoverflow.com/questions/55302872
复制相似问题