1

目前我正在研究一个 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) 处。这会导致无法预料的后果吗?
谢谢

4

1 回答 1

2

现在,GC 是否真的会在 func() 结束和 Callback 之间发生碰撞,因此实际上会在堆上收集对象?

不,引用将保存在 ThreadPool 中,因为您在 lambda 函数中使用它(“this”)。

于 2013-08-09T07:55:45.657 回答