Нулевая ссылка при печати WPF FixedPage в Windows 8.1 - PullRequest
1 голос
/ 22 марта 2019

У меня есть приложение .net Framework v4.7.2 WPF, которое печатает FixedPage, который без проблем работал в Windows 7, но я столкнулся с некоторыми проблемами при запуске его в Windows 8.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.WriteAsync(...) на writer.Write(...) ошибка исчезает.

Мне удалось воспроизвести ошибку в Windows 8.1, Windows Server 2012 R2 и Windows Server 2016. Мне не удалось воспроизвести ошибку в Windows 10.

Есть ли предложения по асинхронной печати в Windows 8.1?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вы можете сделать метод 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);
    }
}
0 голосов
/ 25 марта 2019

@ ответ Рене исправил проблему, поэтому очевидно, что проблема заключалась в том, что 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);
}

Однако кажется странным, что код работал на Windows 10, но не на Windows 8.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...