¿Cómo deshace a AVAudioPlayer cuando se invoca el evento FinishedPlaying?

Estoy usando AVAudioPlayer para reproducir un sonido cuando un usuario toca una fila en un UITableView. Si tocan la fila de nuevo, el jugador se detiene y se deshace, y si escuchan la canción hasta que se termina, el manejador de FinshedPlaying se deshace del jugador.

El problema que tengo es que cuando bash deshacerme del jugador en el manejador de FinishedPlaying, aparece el post de error:

System.ObjectDisposedException: el object de jugador era Dispose () d durante la callback, esto ha corrompido el estado del progtwig

Aquí está el código, ¿alguna idea de qué estoy haciendo mal?

void HandleOnRequestPlayMusic (object sender, UrlEventArgs e) { var url = Utils.UrlFromString(e.Url); string oldUrl = ""; if (musicPlayer != null) { oldUrl = musicPlayer.Url.AbsoluteString; KillAudioPlayer(); // no problems killing the audio player from here } if (oldUrl != url.AbsoluteString) { musicPlayer = AVAudioPlayer.FromUrl(url); musicPlayer.FinishedPlaying += HandleAudioFinished; musicPlayer.Play(); } } void HandleAudioFinished (object sender, AVStatusEventArgs e) { KillAudioPlayer(); // killing audio player from here causes app to crash } void KillAudioPlayer () { if (musicPlayer != null) { InvokeOnMainThread(() => { musicPlayer.Stop(); musicPlayer.FinishedPlaying -= HandleAudioFinished; musicPlayer.Dispose(); musicPlayer = null; }); } } 

No utilice InvokeOnMainThread allí, porque InvokeOnMainThread espera que se complete la acción de input antes de volver a su llamador. Es por eso que su llamada Dispose está ocurriendo mientras todavía está dentro de la llamada a KillAudioPlayer , dentro de la HandleAudioFinished llamada HandleAudioFinished .

En su lugar, use BeginInvokeOnMainThread , que progtwigrá su acción de limpieza para que ocurra en el hilo principal, pero regresará inmediatamente a su function KillAudioPlayer, lo que le permitirá finalizar.