定义了一个 List<string> Buffer
thread1:每隔2秒向Buffer更新数据;
thread2: Buffer每次更新数据后,对其内数据进行处理 process(Buffer)可是每次运行都会抛出异常提示thread1将Buffer的count修改
小弟我已经试过lock(this){process(Buffer)} 、lock(((IList)Buffer).SyncRoot)、System.Threading.Monitor.Enter(Buffer)
可是都锁不住Buffer,有什么办法能解决这个问题呢??
thread1:每隔2秒向Buffer更新数据;
thread2: Buffer每次更新数据后,对其内数据进行处理 process(Buffer)可是每次运行都会抛出异常提示thread1将Buffer的count修改
小弟我已经试过lock(this){process(Buffer)} 、lock(((IList)Buffer).SyncRoot)、System.Threading.Monitor.Enter(Buffer)
可是都锁不住Buffer,有什么办法能解决这个问题呢??
解决方案 »
- 如何获取访问机的源端口
- c# 触发网页中图片onclick事件
- 请教:关于NHibernate实体类生成的问题
- c#插入数据库的问题(中文)
- 【100】简单的 多条件判断语句
- TREEVIEW绑定数据根据数据不同显示不同图标
- DropDownList怎么实现网站友情连接的跳转?(asp.net(C#))?
- Window服务执行Socket服务器端程序,出错!请问如何执行?(问题解决就结贴)
- 使用VS2003的问题,新建属性对话框空白,有人遇到过吗?
- 使用stream实现server和client端字符串发送和自动收,如何使自动收到的string自动显示到textbox 中,请高手指点。
- 怎么控制DataGridView列宽?
- 笑菜鸟又来啦
List<> itself can be synchronized:using System;
using System.Threading;
using System.Collections.Generic;namespace ConsoleApplication1
{
class Program
{
List<string> Buffer = new List<string>();
void ThreadAdder(object state)
{
for (int i = 0; ; i++)
{
lock (Buffer) //<---
{
Buffer.Add(i.ToString());
}
Thread.Sleep(1000);
}
}
void ThreadProcessor(object state)
{
while (true)
{
lock (Buffer) //<---
{
for (int i = 0; i < Buffer.Count; i++)
{
if (Buffer[i].Length < 10) Buffer[i] = Buffer[i] + ".";
Console.WriteLine(Buffer[i]);
}
Console.WriteLine();
}
Thread.Sleep(1000);
}
}
public void Run()
{
ThreadPool.QueueUserWorkItem(ThreadAdder);
ThreadPool.QueueUserWorkItem(ThreadProcessor);
} static void Main(string[] args)
{
new Program().Run();
Console.ReadLine();
}
}
}
List<string> _buffer;
ManualResetEvent _event;
readonly object _lockObj = new object();
private void btn_buffer_Click(object sender, EventArgs e)
{
_buffer = new List<string>();
_event = new ManualResetEvent(false);
new Thread(new ThreadStart(update)).Start();
new Thread(new ThreadStart(process)).Start();
} private void update()
{
while (true)
{
lock (_lockObj)
{
_buffer.Add(new Random().Next().ToString());
}
_event.Set();
Thread.Sleep(2000);
}
} private void process()
{
while (true)
{
while (_event.WaitOne())
{
lock (_lockObj)
{
for (int i = 0; i < _buffer.Count; i++)
_buffer[i] = (int.Parse(_buffer[i]) + 1).ToString();
}
}
}
}
{
while (true)
{
lock (Buffer)
{
for (int i = 0; i < Buffer.Count; i++)
{
if (Buffer[i].Length < 10)
{
Buffer[i] = Buffer[i] + ".";
Console.WriteLine(Buffer[i]);
}
else Buffer.RemoveAt(i); // remove an element
}
Console.WriteLine();
}
Thread.Sleep(1000);
}
}
private void btn_buffer_Click(object sender, EventArgs e)
{
_buffer = new List<string>();
new Thread(new ThreadStart(update)).Start();
new Thread(new ThreadStart(process)).Start(); }
private void update()
{
while (true)
{
lock (_buffer)
{
_buffer.Add(new Random().Next().ToString());
}
Thread.Sleep(2000);
}
} private void process()
{
while (true)
{
lock (_buffer)
{
for (int i = 0; i < _buffer.Count; i++)
_buffer[i] = (int.Parse(_buffer[i]) + 1).ToString();
}
}
}
不知对你有没有帮助??