我想从一个线程向另一个线程添加项目并从另一个线程删除项目。但是,我不确定是否会遇到多个线程访问同一个对象的问题。我已经读了一些关于锁的声明,但我不知道如何实现这一点。总之,问题是,我如何确保线程安全地访问我的列表。在.Net中添加和删除列表项的线程安全方式
0
A
回答
4
使用SyncRoot上到IList中:
lock(SomeList.SyncRoot) {...}
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);
}
}
}
}
}
我也许还应该补充说,对于比这个基本示例更复杂的任何东西,您可能都希望对列表本身使用不同的对象。
private object lockObj = new Object();
private void DoOtherThreadWork() {
while (true) {
//so something with thread. Sleep it, whatever...
lock(_lockObj) {
1
如果你正在做一个生产者/消费者系统 - 这听起来像你 - a synchronized Queue听起来比较合适的结构,而不是一个列表。
相关问题
- 1. 多个线程添加和删除项目到列表框
- 2. 列表<String>的添加方法是线程安全还是不安全?
- 3. 线程安全的搜索和添加
- 4. SocketAsyncEventArgs和.Net中的线程安全
- 5. 在SWIFT OS X中以编程方式添加和删除NSTextField
- 6. 在优化,线程安全的方式
- 7. 更好的方式来添加/从列表中删除列表项目以无序的方式与Jquery
- 8. jquery添加和删除列表框中的项目
- 9. 添加访问和删除python列表中的项目
- 10. 列表线程安全吗?
- 11. VB.NET线程安全列表?
- 12. 线程安全,列表,绑定和WPF
- 13. 如何以线程安全方式添加延迟(TcpClient)
- 14. 线程安全C++ std :: set支持多线程中的添加,删除和迭代器
- 15. .NET - Queue.Enqueue方法线程安全吗?
- 16. 以线程安全的方式枚举列表
- 17. 从列表中删除项目(.net 2.0)
- 18. 线程安全的方式来增加和德尔福
- 19. NSArrayController - 添加:&删除:以编程方式
- 20. 安装后删除程序从添加/删除程序列表Wix
- 21. 在线程中安全地获取列表框项目值
- 22. 从Perl列表中删除元素的安全方法?
- 23. .NET DynamicMethod线程安全?
- 24. .NET System.Net.CookieContainer线程安全吗?
- 25. 锁ILIST .NET线程安全
- 26. linux/list.h - 如何从列表中安全删除项目?
- 27. .NET中的线程安全集合
- 28. 链接列表,值,添加和删除
- 29. 如何添加到列表框线程安全(通过扩展方法)
- 30. 添加和删除列表框之间的项目
我不认为IList有SyncRoot吗?这只是ArrayLists? – 2009-07-30 11:02:27
是的。这是一个明确的接口实现。 ((IList)someList).SyncRoot – 2009-07-30 11:14:22