in your main thread (the GUI thread) because it blocks execution as you have noticed. Avoid it also in worker threads. Using it is an indication of bad design.
The solution is to use worker threads (which are already used internally when using the Media Player) and handling events.
In your case you might use the AxWindowsMediaPlayer.playState property (Windows)
] to get the actuals state (e.g. to check if an actually playing sound should be stopped before playing a new one) and the PlayStateChange Event of the AxWindowsMediaPlayer Object (Windows)
] to get informed when playing has stopped at the end (to know when playing another media can be started).
How and when to use these and other functions depends on what you want to do, when it should be done, and which kinds of events should be handled. Define this first and think about how it can be implemented. That is a design task. Then read the documentation for the used classes (here the Media Player and the related classes). Once that is done, start implementing it by writing code.