Loops are a bad idea in .NET applications: unless they are on a different thread than the original UI thread - and yours isn't - the UI itself doesn't get updated until the loop ends and code returns to "normal processing" and can respond to Paint events. So while you loop runs, you don't get to see any changes!
For this kind of thing, there are two ways to do it:
1) The easiest way is to not use a loop, but use a Timer which reads the level periodically - 1/10 second would probably be enough - and updates the progress bar.
2) The more complex way is to start a new thread to monitor the levels, and repost back to the main thread with updates so it can update the Progress bar - it has to be like that, because you can't access UI elements from outside the thread they were created on: the UI thread. One way to do that is to use a
BackgroundWorker Class (System.ComponentModel)[
^] instance - it has progress updating built in to the class, so it makes life a lot simpler than teh alternative of Invoking controls to move code back to the UI thread for the update.