{"record":{"id":"78a5c3ed28dc6bd5","repo":"SixLabors/ImageSharp","slug":"maxdegreeofparallelism","errorCode":null,"errorMessage":"maxDegreeOfParallelism","messagePattern":"maxDegreeOfParallelism","errorType":"validation","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/ImageSharp/Advanced/ParallelExecutionSettings.cs","lineNumber":36,"sourceCode":"    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ParallelExecutionSettings\"/> struct.\n    /// </summary>\n    /// <param name=\"maxDegreeOfParallelism\">\n    /// The value used for initializing <see cref=\"ParallelOptions.MaxDegreeOfParallelism\"/> when using TPL.\n    /// If set to <c>-1</c>, there is no limit on the number of concurrently running operations.\n    /// </param>\n    /// <param name=\"minimumPixelsProcessedPerTask\">The value for <see cref=\"MinimumPixelsProcessedPerTask\"/>.</param>\n    /// <param name=\"memoryAllocator\">The <see cref=\"MemoryAllocator\"/>.</param>\n    public ParallelExecutionSettings(\n        int maxDegreeOfParallelism,\n        int minimumPixelsProcessedPerTask,\n        MemoryAllocator memoryAllocator)\n    {\n        // Shall be compatible with ParallelOptions.MaxDegreeOfParallelism:\n        // https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions.maxdegreeofparallelism\n        if (maxDegreeOfParallelism is 0 or < -1)\n        {\n            throw new ArgumentOutOfRangeException(nameof(maxDegreeOfParallelism));\n        }\n\n        Guard.MustBeGreaterThan(minimumPixelsProcessedPerTask, 0, nameof(minimumPixelsProcessedPerTask));\n        Guard.NotNull(memoryAllocator, nameof(memoryAllocator));\n\n        this.MaxDegreeOfParallelism = maxDegreeOfParallelism;\n        this.MinimumPixelsProcessedPerTask = minimumPixelsProcessedPerTask;\n        this.MemoryAllocator = memoryAllocator;\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"ParallelExecutionSettings\"/> struct.\n    /// </summary>\n    /// <param name=\"maxDegreeOfParallelism\">\n    /// The value used for initializing <see cref=\"ParallelOptions.MaxDegreeOfParallelism\"/> when using TPL.\n    /// If set to <c>-1</c>, there is no limit on the number of concurrently running operations.\n    /// </param>\n    /// <param name=\"memoryAllocator\">The <see cref=\"MemoryAllocator\"/>.</param>","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/SixLabors/ImageSharp/blob/59ce6af6fc29027cda277ef62d4d1694a8acce91/src/ImageSharp/Advanced/ParallelExecutionSettings.cs#L18-L54","documentation":"The ParallelExecutionSettings constructor validates maxDegreeOfParallelism against the ParallelOptions.MaxDegreeOfParallelism contract: valid values are -1 (unbounded) or any positive integer. Passing 0 or any value less than -1 throws ArgumentOutOfRangeException.","triggerScenarios":"Constructing ParallelExecutionSettings with maxDegreeOfParallelism = 0 or <= -2, e.g. from user-supplied parallelism configuration or an environment-derived value that defaulted to 0.","commonSituations":"Parsing an int from config where 'auto' was mapped to 0 instead of -1; computing a thread count from Environment.ProcessorCount math that underflowed; copying a Task parallelism option of 0 meaning 'unspecified' into this API.","solutions":["Pass -1 for unlimited parallelism instead of 0","Pass a positive integer (>= 1) for a fixed degree of parallelism","Normalize configuration values before constructing: value <= 0 && value != -1 -> clamp or map to -1"],"exampleFix":"// before\nvar settings = new ParallelExecutionSettings(parallelism, minPixels, allocator); // parallelism == 0\n// after\nint dop = parallelism == 0 ? -1 : parallelism;\nvar settings = new ParallelExecutionSettings(dop, minPixels, allocator);","handlingStrategy":"validation","validationCode":"if (maxDegreeOfParallelism is 0 or < -1)\n    throw new ArgumentOutOfRangeException(nameof(maxDegreeOfParallelism), \"Must be -1 or a positive integer.\");","typeGuard":"bool IsValidDop(int v) => v is -1 or > 0;","tryCatchPattern":"try { var s = new ParallelExecutionSettings(dop, minPixels, allocator); }\ncatch (ArgumentOutOfRangeException ex) { logger.LogError(ex, \"Invalid MaxDegreeOfParallelism\"); }","preventionTips":["Remember the contract mirrors ParallelOptions.MaxDegreeOfParallelism: -1 means unlimited, never 0","Map config 'auto/unspecified' values to -1, not 0","Sanitize any user/environment-supplied parallelism before constructing settings"],"tags":["parallelism","argument-out-of-range","configuration"],"backgroundTag":"value-out-of-range","analyzedSha":"59ce6af6fc29027cda277ef62d4d1694a8acce91","analyzedAt":"2026-09-13T18:34:59.331Z","contentChangedAt":"2026-09-13T18:34:59.331Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}