C# 在Windows 8.1中打印WPF FixedPage时引用为空

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

我有一个.net framework v4.7.2 WPF应用程序,它打印一个
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
块中使用异步方法,而不等待它