I am trying to sample the cpu usage of all the running processes but in all the solutions i found there is a need sleeping 1 second which is a problem because i want to sample it as fast as possible to update a remote service. i also tried using "PercentProcessorTime" using WMI query Win32_PerfFormattedData_PerfProc_Process. but it returns wrong values (is it per processor?)
That's not possible, waiting long enough to acquire the next sample is essential. The processor is only ever in one of two states. It is either executing code, running as fast as it can. Or it is entirely stopped by a HLT instruction, which happens when the operating system's thread scheduler cannot find any work to do. 64 times per second, a clock interrupt wakes it up from that halt state and the scheduler goes looking to see if anything is ready to run.
The perf counter tells you how often the processor was running full bore vs how often it was stopped since the last time you sampled the counter. If you don't wait long enough then the accuracy of the number starts to suffer. Down to only ever measuring 0 or 100% if you wait less than 16 milliseconds. The software version of the Nyquist-Shannon sampling theorem.
Waiting for 1 second between samples is boilerplate, that's what you see in Perfmon.exe and Taskmgr.exe