этот код:
try{
_player.Stop();
_player.Release();
_player.Dispose();
_player = null;
}
catch( Exception)
{
}
}
работает только если я поставил точку останова на _Player.Stop(). Зачем? Я использую Xamarin Studio, я не использую точку останова, в которой говорится: "jobject" не должен быть IntPtr.Zero. Имя параметра: jobject
что это значит? и почему это работает, только если у меня есть точка останова?
также ему это не нравится
if (_Play.Isplaying)//он всегда дает мне эту ошибку: IntPtr.Zero. Имя параметра: jobject
button.Click += delegate { if( flag == 1) { return; } ThreadPool.QueueUserWorkItem(o=> Stopped()); int temp = Convert.ToInt16(test1.Text) ; temp = temp * 44100 *60 *2; if( tone1 ==0) { trackW = new whitenoise(temp); trackW.Frequency = Num; //Convert.ToDouble(Beattext.Text); ThreadPool.QueueUserWorkItem(o=> trackW.play()); flag = 1; }else if (tone1 ==1) { trackP = new PinkNoise(temp); trackP.Frequency = Num;//Convert.ToDouble(Beattext.Text); ThreadPool.QueueUserWorkItem(o=> trackP.play()); flag = 1; } else if (tone1 ==2 ) { trackB = new BrownNoise(temp); trackB.Frequency =Num;// Convert.ToDouble(Beattext.Text); ThreadPool.QueueUserWorkItem(o=> trackB.play()); flag = 1; } else if (tone1 ==3 ) { _player = MediaPlayer.Create(this, Resource.Raw.dark); _player.Start(); //flag = 1; } else if (tone1 ==4 ) { _player2 = MediaPlayer.Create(this, Resource.Raw.thunder); _player2.Start(); //flag = 1; } };
В Xamarin.iOS MediaPlayer
- это пространство имен, а не тип. Поэтому неясно, какой тип создается с помощью:
_player = MediaPlayer.Create(this, Resource.Raw.dark);
Теперь несколько типов, связанных с носителями, являются асинхронными, то есть когда вы вызываете Stop
он попросит игрока остановиться, а затем немедленно вернуться. IOW вы получите контроль до того, как будет завершено фактическое действие остановки. Вероятно, это объясняет, почему создание точки останова делает ваш код работоспособным (это приводит к задержкам, которые делают его похожим на то, что он работает синхронно).
_player.Release();
Никогда не вызывайте Release
вручную (для этой строки должно быть предупреждение компилятора). Это необходимо в особых случаях, когда вы выполняете ручное управление памятью (например, вызываете " Retain
). Этот очень низкий уровень (внутренним элементам XI это требуется) и очень редко требуется в коде пользователя.
_player.Dispose();
Это также неправильное место для вызова Dispose
поскольку Stop
может не выполнить эту работу (и удаление экземпляра может создать проблему, поскольку она все еще используется, останавливается, изначально). Некоторые типы предоставляют события, которые расскажут вам, когда на самом деле происходят вещи (например, остановка). Даже тогда вы можете просто позволить GC выполнить эту работу.