C# 安全清除列表(具有并发性)

C# 安全清除列表(具有并发性),c#,list,concurrency,naudio,C#,List,Concurrency,Naudio,你好! 我有ListsoundBuffer-从麦克风获取音频信号 void _waveInStream_DataAvailable(object sender, WaveInEventArgs e) { lock(_lockObject) { for (int i = 0; i < e.BytesRecorded; i++) { _soundBuffer.Add(e.Buffer[i]); }

你好! 我有
List
soundBuffer-从麦克风获取音频信号

void _waveInStream_DataAvailable(object sender, WaveInEventArgs e)
{
  lock(_lockObject)
   {
    for (int i = 0; i < e.BytesRecorded; i++)
            {
                _soundBuffer.Add(e.Buffer[i]);
            }
   }
}
以及:

void\u timerSoundCount\u经过时间(对象发送方,ElapsedEventArgs e)
{
如果(_soundBuffer.Count>2*1024*1024)
{
var能量=GetSignalEnergy(_soundBuffer);
如果(能量=5*1024*1024)
{…相同的操作}
else如果(_sounfBuffer.Count>=10*1024*1024)
{{u soundBuffer.Clear();//非常大的缓冲区}
}
每10秒我检查一次缓冲区大小。如果太大,我就清除缓冲区,因为我可以检测语音\静音并清除该代码处的缓冲区

所以,问题是:当我在计时器上执行
\u soundBuffer.Clear()
,同时在
\u waveInStream\u DataAvailable
时,我会向缓冲区添加新字节吗?它会被currupt写入吗? 这会是僵局吗

如果是这样的话,你能帮助我如何安全地清除缓冲区吗


谢谢!

如果这两个操作是从同一个线程执行的,则不会发生死锁

如果有多个线程同时写入/读取列表,则应使用
lock
()来防止多个线程同时访问对象。有关简单示例,请参见此处()


或者,您可以使用System.Collections.concurrent命名空间()中的并发集合如果数据不是随机访问的,那么使用
ConcurrentQueue
可能比较合适。您也可以实现自己的并发收集,尽管这要复杂得多。

@Sinatr,我只是在键入问题时出现了一个简单的错误。谢谢!
 _timerSoundCount = new System.Timers.Timer();
 _timerSoundCount.Interval = 10000;  // check every 10 second
 _timerSoundCount.Enabled = true;
 _timerSoundCount.Elapsed += _timerSoundCount_Elapsed;
 _timerSoundCount.Start();
void _timerSoundCount_Elapsed(object sender, ElapsedEventArgs e)
    {
        if(_soundBuffer.Count>2*1024*1024)
       {
        var energy = GetSignalEnergy(_soundBuffer);
        if(energy<1) //if energy of signal is small- clear buffer.
        {
            lock (_lockObject)
                _soundBuffer.Clear();
        }
        }
        else if(_soundBuffer.Count>=5*1024*1024)
         {... the same operation}
        else if(_sounfBuffer.Count>=10*1024*1024)
         { _soundBuffer.Clear();//very big buffer }
    }