我有一个继承自MemoryStream的类以提供一些缓冲。该类的工作原理与预期的完全一致,但每隔一段时间,在读取期间出现InvalidOperationException,并显示错误消息:可以锁定列表失败
收集已被修改;枚举操作可能不会执行。
我的代码如下,并且列举了集合的唯一路线似乎是:
m_buffer = m_buffer.Skip(count).ToList();
不过,我有一个和所有可以锁定,所以我内修改m_buffer对象等操作对于Write操作如何干扰Read来导致异常感到困惑?
public class MyMemoryStream : MemoryStream
{
private ManualResetEvent m_dataReady = new ManualResetEvent(false);
private List<byte> m_buffer = new List<byte>();
public override void Write(byte[] buffer, int offset, int count)
{
lock (m_buffer)
{
m_buffer.AddRange(buffer.ToList().Skip(offset).Take(count));
}
m_dataReady.Set();
}
public override int Read(byte[] buffer, int offset, int count)
{
if (m_buffer.Count == 0)
{
// Block until the stream has some more data.
m_dataReady.Reset();
m_dataReady.WaitOne();
}
lock (m_buffer)
{
if (m_buffer.Count >= count)
{
// More bytes available than were requested.
Array.Copy(m_buffer.ToArray(), 0, buffer, offset, count);
m_buffer = m_buffer.Skip(count).ToList();
return count;
}
else
{
int length = m_buffer.Count;
Array.Copy(m_buffer.ToArray(), 0, buffer, offset, length);
m_buffer.Clear();
return length;
}
}
}
}
这确实是一个错误,但它不应该导致InvalidOperationException。 – SoftMemes 2009-12-07 09:44:13
是的,它不会。这就是为什么我说“至少有一个”。你在回答中提到的问题很可能导致这个问题。 – 2009-12-07 09:49:24
如果我在持有锁的Read方法中等待,我将如何获得Write方法中的锁? – sipwiz 2009-12-07 09:54:56