目前我正在研究一个 XNA 项目,并Microsoft.Xna.Framework.Audio.SoundEffectInstance
通过创建一个包装器来稍微改进一下 -class,该包装器提供事件来指示声音的不同状态(即停止、播放、暂停)。
现在我有以下情况:我创建了我的类“EventSoundEffect”的一个实例作为本地引用,例如:
public void func(){
...
EventSoundEffect ese = new EventSoundEffect( /*some sound */);
...
ese.Stopped += Callback;
ese.playAsync();
//method ends directly after ese.playAsync()
}
private void Callback(object sender, EventArgs e){
// do stuff
}
ThreadPool
我使用and循环实现了事件触发while
。不是很好,但它的工作原理。当声音的状态发生变化时,我发现在while
-loop中
//Pseudocode
public void playAsync(){
sound.Play(); // starts playing sound asynchronously, returns immediately (SoundEffectInstance)
ThreadPool.QueueUserWorkItem( obj => {
while(...){
if(sound.SoundState == SoundState.Stop)
break;
}
if(SoundStoppedEvent != null)
SoundStoppedEvent(this, new EventArgs());
}
}
}
现在,是否真的会发生 GC 将在结束之间进行攻击,func()
因此Callback
实际上会在堆上收集对象?
对对象的本地引用在 之后丢失playAsync()
,但来自 的线程ThreadPool
仍然在它上面工作,最终引用将显示在Callback
(sender) 处。这会导致无法预料的后果吗?
谢谢