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 }
}