-1

私はこの音のリストを持っています:

     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();
        }
    }

イベントをデリゲートにしているので、オブジェクトのロックが解除されるまで常に待機すると思いました。しかし、そこでフリーズしているようです。

4

4 に答える 4

-1

デリゲートは単なるコールバックであり、スレッド化を保証するものではありません。すでにスレッドセーフになっているConcurrentBag クラスをチェックアウトすると、コレクションに関するロックについてそれほど心配する必要がなくなります。

于 2013-07-09T13:08:07.547 に答える
-2

おそらく、 stopメソッドのロック スコープ内の呼び出しの 1 つがStreamEndイベントを発生させているようです。stopメソッドのコードをステップ実行して、イベントにジャンプするかどうかを確認することで、これをテストできます。私はそれがsourceVoice.Stop()呼び出しであると推測する危険があります。

于 2013-07-09T13:10:16.040 に答える