{"record":{"id":"4fbafe555180b826","repo":"dotnet/wpf","slug":"sr-image-onlyoneinit","errorCode":null,"errorMessage":"SR.Image_OnlyOneInit","messagePattern":"SR\\.Image_OnlyOneInit","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Imaging/BitmapInitialize.cs","lineNumber":21,"sourceCode":"\nusing System.ComponentModel;\n\nnamespace System.Windows.Media.Imaging\n{\n    #region BitmapInitialize\n    /// <summary>\n    /// Utility class providing support for ISupportInitialize\n    /// </summary>\n    internal class BitmapInitialize : ISupportInitialize\n    {\n        public BitmapInitialize()\n        {\n        }\n\n        public void BeginInit()\n        {\n            if (IsInitAtLeastOnce)\n                throw new InvalidOperationException(SR.Format(SR.Image_OnlyOneInit, null));\n\n            if (IsInInit)\n                throw new InvalidOperationException(SR.Format(SR.Image_InInitialize, null));\n\n            _inInit = true;\n        }\n\n        public void EndInit()\n        {\n            if (!IsInInit)\n                throw new InvalidOperationException(SR.Format(SR.Image_EndInitWithoutBeginInit, null));\n\n            _inInit = false;\n            _isInitialized = true;\n        }\n\n        public void SetPrologue()\n        {","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Imaging/BitmapInitialize.cs#L3-L39","documentation":"ISupportInitialize.BeginInit on BitmapCacheFile/BitmapInitialize types may only be called once per object; WPF deliberately forbids re-initialization. Calling BeginInit after the object has already been initialized throws InvalidOperationException with SR.Image_OnlyOneInit.","triggerScenarios":"Calling BeginInit() a second time on the same BitmapImage (or other IBitmapInitialize implementer) after a prior BeginInit/EndInit cycle has completed (IsInitAtLeastOnce == true).","commonSituations":"Reusing a cached BitmapImage instance to load a new URI; loops that reconfigure one shared image object per item; copy-pasted init code running twice for the same instance.","solutions":["Create a new BitmapImage instance for each image instead of re-initializing an existing one","Track initialization with a bool flag so BeginInit is only invoked once per instance","If the URI changes, assign a fresh object or use the Freezable Clone pattern instead of re-running BeginInit"],"exampleFix":"// before\nif (_bitmap == null) { _bitmap = new BitmapImage(); _bitmap.BeginInit(); }\n_bitmap.BeginInit(); // throws on reuse\n// after\n_bitmap = new BitmapImage();\n_bitmap.BeginInit();\n_bitmap.UriSource = new Uri(path);\n_bitmap.EndInit();","handlingStrategy":"validation","validationCode":"bool canBeginInit(BitmapImage img) => img is { } && !_initializedImages.Contains(img); // track instances you already initialized\nclass InitTracker { private static readonly HashSet<BitmapImage> Done = new(); public static bool IsNew(BitmapImage i) => Done.Add(i); }","typeGuard":"bool IsReusableImage(BitmapImage img) => img == null; // BitmapImage is single-init: treat as non-reusable, always create new","tryCatchPattern":null,"preventionTips":["Treat BitmapImage as single-use: create a new instance per image load","Never share one BitmapImage across multiple loads or data items","Centralize image creation in a factory method so BeginInit is called exactly once"],"tags":["wpf","initialization","invalid-operation","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"}