{"record":{"id":"f30816e6b9590409","repo":"dotnet/wpf","slug":"sr-streamobjectdisposed-ignoreflushandclosestream","errorCode":null,"errorMessage":"SR.StreamObjectDisposed","messagePattern":"SR\\.StreamObjectDisposed","errorType":"exception","errorClass":"ObjectDisposedException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/IgnoreFlushAndCloseStream.cs","lineNumber":207,"sourceCode":"                if (!_disposed)\n                {\n                    _stream = null;\n                    _disposed = true;\n                }\n            }\n            finally\n            {\n                base.Dispose(disposing);\n            }\n        }\n\n\n        #region Private Methods\n\n        private void ThrowIfStreamDisposed()\n        {\n            if (_disposed)\n                throw new ObjectDisposedException(null, SR.StreamObjectDisposed);\n        }\n\n        #endregion Private Methods\n\n        #region Private Variables\n\n        private Stream _stream;\n        private bool _disposed;\n\n        #endregion Private Variables\n    }    \n}\n\n","sourceCodeStart":189,"sourceCodeEnd":221,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/IgnoreFlushAndCloseStream.cs#L189-L221","documentation":"ObjectDisposedException with message SR.StreamObjectDisposed thrown by IgnoreFlushAndCloseStream.ThrowIfStreamDisposed, a guard invoked by every public stream member (Length, Position, Seek, SetLength, Read, Write). IgnoreFlushAndCloseStream wraps an inner stream to suppress Flush/Close; once the wrapper is disposed any further use fails.","triggerScenarios":"Calling Read, Write, Seek, Position, Length or SetLength on an IgnoreFlushAndCloseStream after Dispose was called on it (often indirectly by closing the owning package or part).","commonSituations":"Using a PackagePart stream reference after the Package was closed; caching a part stream across a using-scope; writing to a stream captured before a Package.Close/Dispose call.","solutions":["Keep the stream inside a using block and finish all I/O before disposing the package.","Reopen the PackagePart stream if you need to continue writing after close.","Restructure code so the package outlives all uses of its part streams.","Check ObjectDisposedException.IsDisposed-style guards by tracking lifetime explicitly rather than catching."],"exampleFix":"// before\nStream s = part.GetStream();\npackage.Close();\ns.Write(data, 0, data.Length); // throws\n// after\nusing (Stream s = part.GetStream())\n{\n    s.Write(data, 0, data.Length);\n}\npackage.Close();","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"bool IsUsable(Stream s) => s is { CanRead: true } or { CanWrite: true };","tryCatchPattern":"try { stream.Write(buffer, 0, buffer.Length); }\ncatch (ObjectDisposedException) { stream = part.GetStream(); /* reopen and retry */ }","preventionTips":["Always scope part streams in using blocks","Close the Package only after all part I/O completes","Never cache part streams beyond the package lifetime"],"tags":["stream","objectdisposedexception","packaging","lifecycle"],"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-22T01:17:13.364Z"}