在.Net中从列表中添加和删除项的线程安全方法
我想从一个线程向列表中添加项目,从另一个线程中删除同一列表中的项目。但是,我不确定多个线程访问同一对象是否会遇到问题。我已经读了一些关于lock语句的内容,但我不知道如何实现它。简言之,问题是,如何确保线程安全地访问我的列表。使用SyncRoot进入IList:在.Net中从列表中添加和删除项的线程安全方法,.net,multithreading,locking,thread-safety,.net,Multithreading,Locking,Thread Safety,我想从一个线程向列表中添加项目,从另一个线程中删除同一列表中的项目。但是,我不确定多个线程访问同一对象是否会遇到问题。我已经读了一些关于lock语句的内容,但我不知道如何实现它。简言之,问题是,如何确保线程安全地访问我的列表。使用SyncRoot进入IList: lock(SomeList.SyncRoot) {...} 在IList中使用SyncRoot: lock(SomeList.SyncRoot) {...} 下面是一个非常粗略的锁定示例。现在,在列表中添加和删除时,两个线程都是安全
lock(SomeList.SyncRoot) {...}
在IList中使用SyncRoot:
lock(SomeList.SyncRoot) {...}
下面是一个非常粗略的锁定示例。现在,在列表中添加和删除时,两个线程都是安全的。这不是一个如何创建和使用线程的示例,只是一个如何使用锁的示例
Class A{
private List<int> _list = new List<int>();
private void DoOtherThreadWork() {
while (true) {
//so something with thread. Sleep it, whatever...
lock(_list) {
_list.Add(1);
}
}
}
private void StartWorking(object sender, EventArgs e) {
Thread worker = new Thread(DoOtherThreadWork);
worker.Start();
while (true) {
lock(_list) {
if (_list.Count > 0) {
_list.RemoveAt(0);
}
}
}
}
}
下面是一个非常粗略的锁定示例。现在,在列表中添加和删除时,两个线程都是安全的。这不是一个如何创建和使用线程的示例,只是一个如何使用锁的示例
Class A{
private List<int> _list = new List<int>();
private void DoOtherThreadWork() {
while (true) {
//so something with thread. Sleep it, whatever...
lock(_list) {
_list.Add(1);
}
}
}
private void StartWorking(object sender, EventArgs e) {
Thread worker = new Thread(DoOtherThreadWork);
worker.Start();
while (true) {
lock(_list) {
if (_list.Count > 0) {
_list.RemoveAt(0);
}
}
}
}
}
如果你在做生产者/消费者系统——听起来像是——听起来像是更合适的结构,而不是列表。如果你在做生产者/消费者系统——听起来像是——听起来像是更合适的结构,而不是列表。我认为IList没有SyncRoot,是吗?只是阵列列表?是的。这是一个显式的接口实现。((IList)someList)。SyncRoot我认为IList没有SyncRoot,是吗?只是阵列列表?是的。这是一个显式的接口实现。((IList)someList).SyncRootI正在尝试这样做,但在.NET3.5中,它似乎已被删除。我正在尝试这样做,但在.NET3.5中,它似乎已被删除。