Start here. This is the direct spoken answer to practice first.
Why this question matters
More active work can reduce throughput once workers compete for CPU, memory, connections, locks, or a downstream quota. The limit should describe the bottleneck and deployment shape.
I would identify the constrained resource first. For CPU-bound work, a starting point near the available processor count may be reasonable. For asynchronous calls, the limit should respect the downstream service, connection pool, memory per operation, and latency target rather than CPU count alone. I would enforce it with the API that owns the work, such as ParallelOptions.MaxDegreeOfParallelism, a bounded channel, or SemaphoreSlim, and I would measure several values under realistic load.