Open MediaPlayer - evento no manejado en Thread

Estoy tratando de crear un reproductor multimedia (con la clase Media.MediaPlayer ()) y para esto estoy usando un hilo para procesar las canciones que el usuario carga con OpenFileDialog. Estoy usando el siguiente código para iniciar el proceso de las canciones:

    public static List<MediaFile> MediaList = new List<MediaFile>();
    public static Queue<String> MediaFilesQueue = new Queue<String>();



public static void AddMediaFilesToMediaList()
        {

            String pathToFile;


            while (MediaFilesQueue.Count > 0)
          // all the files are loaded into the Queue before processing
            {
            pathToFile = MediaFilesQueue.Dequeue();
            MediaData.MediaList.Add(new MediaFile(pathToFile));

            MediaFileCreator mfCreator = 
                           new MediaFileCreator(MediaData.MediaList.Count - 1);
            mfCreator.CreateNewMediaFile();


            }

}

Y esta es la clase MediaFileCreator:

public class MediaFileCreator
    {

        private int IndexOfMediaFileCurrentlyProcessed;


        public MediaFileCreator(int idx)
        {
            IndexOfMediaFileCurrentlyProcessed = idx;
        }

        public void CreateNewMediaFile()
        {


            var indexOfMediaFileCurrentlyProcessed = IndexOfMediaFileCurrentlyProcessed;

            var tempMediaFile = MediaData.MediaList[indexOfMediaFileCurrentlyProcessed];

            var tempMediaPlayer = new MediaPlayer();
            var waitHandle = new AutoResetEvent(false); 

            //EventHandler eventHandler = delegate(object sender, EventArgs args)
            //{
            //    waitHandle.Set();
            //};


            tempMediaPlayer.MediaOpened += (sender, args) => waitHandle.Set();

            tempMediaPlayer.Open(new Uri(tempMediaFile.PathToFile));

            waitHandle.WaitOne();


            //while (!tempMediaPlayer.NaturalDuration.HasTimeSpan)
            //{
            //    Thread.Sleep(100);
            //}


            var tempTimeSpan = tempMediaPlayer.NaturalDuration.TimeSpan;
            var hasVideo = tempMediaPlayer.HasVideo;
            var hasAudio = tempMediaPlayer.HasAudio;

            MediaData.MediaList[indexOfMediaFileCurrentlyProcessed].HasVideo = hasVideo;
            MediaData.MediaList[indexOfMediaFileCurrentlyProcessed].HasAudio = hasAudio;
            MediaData.MediaList[indexOfMediaFileCurrentlyProcessed].TimeSpanOfMediaFile
                                                                        = tempTimeSpan;


        } 

Y esta es la clase MediaFile:

 public class MediaFile
    {
        public bool HasAudio = false;
        public bool HasVideo = false;

        public TimeSpan TimeSpanOfMediaFile;

        public String PathToFile = null;

        public MediaFile(String pathToFile)
        {
            PathToFile = pathToFile;
        }
    }

Mi problema es que el programa se detiene enwaitHandle.WaitOne();&nbsp;y trata de correr esa linea una y otra vez. Probé otras variantes como la de la primera sección comentada al adjuntar ese controlador de eventos al evento Open, pero el resultado fue el mismo:waitHandle.Set();&nbsp;nunca se ejecuta y el valor de waitHandle es siempre falso. La única opción que logré poner en funcionamiento es la solución de la segunda sección comentada: bloquear el hilo (con Thread.Sleep) hasta que el archivo esté completamente cargado (el archivo se carga, por ejemplo, cuando se inicializa TimeSpan) ... que es el tiempo perdido y la disminución de rendimiento para mi aplicación. El problema obviamente no es con el evento en sí, porque el evento se dispara si se ejecuta en el hilo principal (el método AddMediaFilesToMediaList () se llama desde un subproceso de BackgroundWorker que inicia el método dentro de un nuevo hilo cuando detecta que hay elementos en el Cola; el subproceso AddMediaFilesToMediaList () se crea connew Thread()&nbsp;) y obviamente el archivo se está cargando porque el TimeSpan está inicializado. Tengo muchas ganas de hacer que la aplicación funcione con waitHandle o algo así. No quiero usar Thread.Sleep () porque es feo y mi aplicación también tiene una pérdida de memoria cuando intento cargar muchos archivos (i toma más de 1.2 GB de memoria y se detiene con errores (OutOfMemory) - Intenté cargar 2048 canciones en él) y creo que podría ser debido a Thread.Sleep (). Incluso si no lo es, será mucho más fácil de depurar sin el problema de Thread.Sleep ().

Entonces, ¿cómo puedo hacer que el waitHandle funcione? ¿Cómo puedo hacer elwaitHandle.Set();&nbsp;correr ? Y si alguien tiene alguna idea sobre de dónde podría provenir ese uso excesivo de memoria, ¡sería genial! (Personalmente creo que es culpa de Thread.Sleep () pero no sé cómo deshacerme de él).

Edición: la razón por la que uso un objeto MediaFileCreator es que inicialmente quería usar un grupo de subprocesos de 2 a 4 subprocesos para procesar los archivos multimedia, pero tuve el mismo problema, así que eliminé ThreadPool y probé con el código publicado anteriormente. Pero ocurrió el mismo problema.

Editar: Logré que funcionara usando un segundo hilo para esperar el evento (no es el código más limpio en este momento, pero lo corregiré).

public class MediaFileCreator
{

    private AutoResetEvent openedEvent = new AutoResetEvent(false);


    public MediaFile CreateNewMediaFile(string filename)
    {

        var mFile = new MediaFile(filename);
        var thread = new Thread(WaitForEvent);
        const int maxTimeToWait = 2000;
        openedEvent.Reset();
        thread.Start(mFile);

        var mediaPlayer = new MediaPlayer();

        mediaPlayer.Open(new Uri(mFile.PathToFile));

        openedEvent.WaitOne(maxTimeToWait);

        var fromThread = Dispatcher.FromThread(Thread.CurrentThread);
        if (fromThread != null) fromThread.InvokeShutdown();

        return mFile;

    }

    private void WaitForEvent(object context)
    {

        var mFile = (MediaFile)context;
        var mediaPlayer = new MediaPlayer();

        mediaPlayer.MediaOpened +=
            delegate
            {
                if (mediaPlayer.NaturalDuration.HasTimeSpan)
                    mFile.TimeSpanOfMediaFile = mediaPlayer.NaturalDuration.TimeSpan;
                mFile.HasAudio = mediaPlayer.HasAudio;
                mFile.HasVideo = mediaPlayer.HasVideo;
                mFile.Success = true;
                mediaPlayer.Close();
                openedEvent.Set();
            };

        mediaPlayer.MediaFailed +=
            delegate
            {
                mFile.Failure = true;
                mediaPlayer.Close();
                openedEvent.Set();
            };

        mediaPlayer.Open(new Uri(mFile.PathToFile));

        Dispatcher.Run();
    }
}