私はこの音のリストを持っています:
List<SourceVoice> runningInstances;
サウンド オブジェクトにイベントを追加して、停止時にリストから削除するようにします。
sourceVoice.StreamEnd += delegate
{
lock (runningInstances)
{
runningInstances.Remove(sourceVoice);
}
};
また、任意のスレッドから呼び出されるこの停止機能もあります。
public void stop(int fadeoutTime)
{
lock (runningInstances)
{
foreach (var sourceVoice in runningInstances)
{
if (!sourceVoice.IsDisposed)
{
sourceVoice.Stop();
sourceVoice.FlushSourceBuffers();
sourceVoice.DestroyVoice();
sourceVoice.Dispose();
}
}
runningInstances.Clear();
}
}
イベントをデリゲートにしているので、オブジェクトのロックが解除されるまで常に待機すると思いました。しかし、そこでフリーズしているようです。