此代码:
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; } };
答案 0 :(得分:0)
在Xamarin.iOS MediaPlayer
中是名称空间,而不是类型。所以不清楚创建的是哪种类型:
_player = MediaPlayer.Create(this, Resource.Raw.dark);
现在有几种与媒体相关的类型是异步的,即当您拨打Stop
时,要求播放器停止然后立即返回。在实际停止操作完成之前,您将恢复控制权。这可能解释了为什么设置一个断点使你的代码工作(它引入的延迟使它看起来像是同步工作)。
_player.Release();
不要手动调用Release
(该行应该有编译器警告)。在非常特殊的情况下,您需要进行手动内存管理(例如,调用Retain
)。用户代码中很少需要非常低级别(XI内部需要它)和非常。
_player.Dispose();
由于Dispose
可能没有完成它的工作,因此也不是致电Stop
的正确位置(处置该实例可能会产生问题,因为它仍在使用,停止,本地)。某些类型提供的事件会告诉您实际发生的事情(如停止)。即便如此,你可能只想让GC做它的工作。