0

自分のクラスMoveToでカーソルを移動するメソッドがあります。WaveProviderこのクラスに Phase Vocoder を実装したので、カーソルを移動するときは、新しい値でいくつかのオブジェクトを再作成する必要があります。は問題ありませんWaveOutが、使用するDirectSoundと がスローされArgumentNullExceptionます。
問題は、プログラムがMoveToメソッド内にあり、オブジェクト内のいくつかの値を変更しているときに、DirectSoundRead メソッド内にあり、クラッシュすることです。WaveProvider位置変更中にロックしようとしましたが、DirectSoundまだ Read メソッドに入ることができます。
修正方法は?

4

1 に答える 1

1

あなたは何をロックしていますか?WaveProvider 内にロック オブジェクトを作成し、MoveTo メソッドと Read メソッドの両方でロックする必要があります。

class MyWaveProvider : IWaveProvider
{
    private object lockObject = new Object();

    public void MoveTo(int pos)
    {
        lock(lockObject)
        {
            // perform the move
        }
    }


    public int Read(byte[] buffer, int offset, int count)
    {
        lock(lockObject)
        {
            // perform the read
        }
    }
}
于 2012-09-17T15:18:54.893 に答える