{"record":{"id":"7f8620ab00929381","repo":"dotnet/wpf","slug":"sr-xpsserializerfactory-writerisclosed","errorCode":null,"errorMessage":"SR.XpsSerializerFactory_WriterIsClosed","messagePattern":"SR\\.XpsSerializerFactory_WriterIsClosed","errorType":"exception","errorClass":"XpsSerializationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/ReachFramework/SerializerFactory/XpsSerializerWriter.cs","lineNumber":473,"sourceCode":"                FinalizeWriter();\n                WritingCompleted.Invoke(sender, e);\n            }\n        }\n\n        private void xsw_WritingCancelled(object sender, WritingCancelledEventArgs e)\n        {\n            if ( WritingCancelled != null)\n            {\n                FinalizeWriter();\n                WritingCancelled.Invoke(sender, e);\n            }\n        }\n\n        private void CheckDisposed()\n        {\n            if (_xpsDocumentWriter == null)\n            {\n                throw new XpsSerializationException(SR.XpsSerializerFactory_WriterIsClosed);\n            }\n        }\n\n        private void FinalizeWriter()\n        {\n            _xpsDocument.Close();\n            _package.Close();\n            _xpsDocument = null;\n            _xpsDocumentWriter = null;\n            _package = null;\n        }\n\n        #endregion\n\n        #region Data\n\n        private Package             _package;\n        private XpsDocument         _xpsDocument;","sourceCodeStart":455,"sourceCodeEnd":491,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/ReachFramework/SerializerFactory/XpsSerializerWriter.cs#L455-L491","documentation":"XpsSerializerWriter.CheckDisposed throws XpsSerializationException(SR.XpsSerializerFactory_WriterIsClosed) when an operation is attempted after the writer has been closed/finalized (its _xpsDocumentWriter field is nulled by FinalizeWriter). It guards Write, WriteAsync, CancelAsync, and CreateVisualsCollator — using a closed serializer writer is invalid state.","triggerScenarios":"Calling Write, WriteAsync, CancelAsync, or CreateVisualsCollator on an XpsSerializerWriter after Close/dispose (FinalizeWriter already ran and set _xpsDocumentWriter to null).","commonSituations":"Writing additional documents after closing the XPS package; reusing a cached writer that was disposed; CancelAsync racing with Close.","solutions":["Do not use the writer after Close/Dispose; create a new XpsSerializerWriter for further writes.","Track writer lifetime and null out references once closed.","Guard calls with an IsDisposed/IsClosed check before invoking write APIs."],"exampleFix":"// before\nwriter.Close();\nwriter.Write(page); // throws\n// after\nwriter.Close();\nwriter = serializerFactory.CreateXpsSerializerWriter(package);\nwriter.Write(page);","handlingStrategy":"type-guard","validationCode":"if (writer == null || writer.IsClosed) throw new InvalidOperationException(\"writer already closed\");","typeGuard":"bool CanWrite(XpsSerializerWriter w) => w != null && !w.IsDisposed;","tryCatchPattern":"try { writer.Write(page); }\ncatch (XpsSerializationException ex) when (writerClosed) { /* recreate writer */ }","preventionTips":["Treat Close/Dispose as terminal; never reuse the writer afterwards.","Null out writer references once closed to make misuse obvious.","Serialize write calls; don't call CancelAsync after Close."],"tags":["wpf","xps","object-disposed","writer-closed"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}