{"record":{"id":"99dc44dbc902695d","repo":"stride3d/stride","slug":"rendercallback","errorCode":null,"errorMessage":"renderCallback","messagePattern":"renderCallback","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Games/Desktop/WindowsMessageLoop.cs","lineNumber":213,"sourceCode":"        /// </summary>\n        public static void Run(ApplicationContext context, RenderCallback renderCallback)\n        {\n            Run(context.MainForm, renderCallback);\n        }\n\n        /// <summary>\n        /// Runs the specified main loop for the specified windows form.\n        /// </summary>\n        /// <param name=\"form\">The form.</param>\n        /// <param name=\"renderCallback\">The rendering callback.</param>\n        /// <param name=\"useApplicationDoEvents\">if set to <c>true</c> indicating whether the render loop should use the default <see cref=\"Application.DoEvents\"/> instead of a custom window message loop lightweight for GC. Default is false.</param>\n        /// <exception cref=\"System.ArgumentNullException\">form\n        /// or\n        /// renderCallback</exception>\n        public static void Run(Control form, RenderCallback renderCallback, bool useApplicationDoEvents = false)\n        {\n            if (form == null) throw new ArgumentNullException(\"form\");\n            if (renderCallback == null) throw new ArgumentNullException(\"renderCallback\");\n\n            using (var renderLoop = new WindowsMessageLoop(form) { UseApplicationDoEvents = useApplicationDoEvents })\n            {\n                while (renderLoop.NextFrame())\n                {\n                    renderCallback();\n                }\n            }\n        }\n   }\n}\n#endif\n","sourceCodeStart":195,"sourceCodeEnd":226,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Games/Desktop/WindowsMessageLoop.cs#L195-L226","documentation":"Argument-null validation on the renderCallback parameter of WindowsMessageLoop.Run. The message loop invokes this callback every iteration to render a frame; a null callback would crash the loop on its first tick, so Run rejects it up front with ArgumentNullException named 'renderCallback'.","triggerScenarios":"Calling Run(form, null) or passing an unset delegate field.","commonSituations":"Refactoring renamed/removed the render method leaving a null delegate; conditional wiring where the callback is only assigned in some code paths.","solutions":["Pass a non-null RenderCallback delegate to Run","Ensure the delegate field is assigned before Run is invoked"],"exampleFix":"// before\nWindowsMessageLoop.Run(form, renderCallback); // renderCallback not assigned\n// after\nrenderCallback = () => RenderFrame();\nWindowsMessageLoop.Run(form, renderCallback);","handlingStrategy":"validation","validationCode":"if (renderCallback is null) throw new InvalidOperationException(\"renderCallback must be assigned\");\nWindowsMessageLoop.Run(form, renderCallback);","typeGuard":"bool HasCallback(RenderCallback? cb) => cb is not null;","tryCatchPattern":"try { WindowsMessageLoop.Run(form, renderCallback); } catch (ArgumentNullException) { /* callback missing; log and abort */ }","preventionTips":["Assign the render delegate before invoking Run","Use a lambda inline (Run(form, RenderFrame)) to avoid unset-field bugs"],"tags":["winforms","render-loop","null-argument"],"backgroundTag":"null-argument","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}