1

現在、私は 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(送信者) に参照が表示されます。これは予期しない結果につながる可能性がありますか?
ありがとうございました

4

1 に答える 1