現在、私は XNA プロジェクトに取り組んでおりMicrosoft.Xna.Framework.Audio.SoundEffectInstance
、サウンドのさまざまな状態 (つまり、停止、再生、一時停止) を通知するイベントを提供するラッパーを作成することで、クラスを少し改善しました。
今、私は次のような状況にあります: クラス "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
とループを使ってイベント発火を実現しましたwhile
。あまり良くありませんが、うまくいきます。音の状態が変化するとき、私はループのようにそれを見つけwhile
ます
//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
(送信者) に参照が表示されます。これは予期しない結果につながる可能性がありますか?
ありがとうございました