"缓冲区已满#34; BufferedWaveProvider在另一个线程中填充时的异常

时间:2016-03-11 08:51:25

标签: c# .net multithreading asynchronous naudio

我有两个BufferedWaveProviders和MixingSampleProvider。第一个BufferedSampleProvider(myBuffer)用于从声卡中传入音频。第二个BufferedWaveProvider(incomingBuffer)用于从网络(TCP)传入音频。
{incomingBuffer正如那样异步填充:

    private static void Receive()
    {
        receiver.BeginReceive(incomingBytes, 0, incomingBytes.Length, SocketFlags.None, ReceiveCallback, null);
    }

    private static void ReceiveCallback(IAsyncResult ar)
    {
        receiver.EndReceive(ar);
        incomingBuffer.AddSamples(incomingBytes, 0 , incomingBytes.Length);
        Receive();
    }

但是在启动程序后7-10秒之后,它因异常而结束。
我应该如何异步填充缓冲区?

1 个答案:

答案 0 :(得分:2)

停止忽略EndReceive的返回值

它告诉您收到了多少字节的数据。这是您需要添加到缓冲区的样本数量(但请确保您不会将样本转换为字节,反之亦然。)

相反,现在您只需将incomingBytes传递给incomingBuffer整个,即使您只通过TCP接收了一个字节。这是垃圾数据,它可以更快地填充缓冲区。

一般来说,方法和函数的返回值是有意义的,只有当你理解你忽略的时才忽略它们(例如,如果你不关心它们)处理除回调之外的任何事情,忽略BeginReceive的返回值是正常的;如果您需要知道是否存在待处理的异步I / O请求,则需要返回值。