两个线程试图访问同一个列表:“System.ArgumentOutOfRangeException”
Two threads trying to access same List :" System.ArgumentOutOfRangeException"
我是线程新手。我有一个列表和 2 个线程 T1 和 T2。
private readonly List<item> myCompletedItems;
我有一个设置集合的方法
public void ItemCreated(item theitem)
{
this.myCompletedItems.add(theitem);
}
我有另一种获取第一项字段值的方法:
public int GetStartItemId()
{
return this.myCompletedItems[0].id;
}
线程 1 正在将项目添加到“myCompletedItems”。但即使在将项目添加到列表之前,线程 2 也在尝试访问列表并抛出“System.ArgumentOutOfRangeException:索引超出范围”。我如何让线程 2 等到所有项目都被线程 1 添加到列表中?
常规列表不是线程安全的,当尝试从多个线程同时使用它时几乎任何事情都可能发生。
How do i make Thread 2 wait until all the items are added to list by Thread 1?
使用 lock if you want to ensure two threads does not access the resource concurrently, or a manualResetEvent/autoResetEvent 阻塞一个线程,直到另一个线程执行某些操作。
或者更实际地,使用 concurrent collections。
但是,多线程不是乱搞和随机尝试事情的好地方。这很容易导致很难重现的错误。即使对于经验丰富的程序员来说,多线程也很困难,您应该对 deadlocks and race conditions before trying to use multi threading. See also asynchronous programming and DataFlow 等潜在危险有相当好的了解,部分这样做是为了避免线程之间手动同步的需要。
我是线程新手。我有一个列表和 2 个线程 T1 和 T2。
private readonly List<item> myCompletedItems;
我有一个设置集合的方法
public void ItemCreated(item theitem)
{
this.myCompletedItems.add(theitem);
}
我有另一种获取第一项字段值的方法:
public int GetStartItemId()
{
return this.myCompletedItems[0].id;
}
线程 1 正在将项目添加到“myCompletedItems”。但即使在将项目添加到列表之前,线程 2 也在尝试访问列表并抛出“System.ArgumentOutOfRangeException:索引超出范围”。我如何让线程 2 等到所有项目都被线程 1 添加到列表中?
常规列表不是线程安全的,当尝试从多个线程同时使用它时几乎任何事情都可能发生。
How do i make Thread 2 wait until all the items are added to list by Thread 1?
使用 lock if you want to ensure two threads does not access the resource concurrently, or a manualResetEvent/autoResetEvent 阻塞一个线程,直到另一个线程执行某些操作。
或者更实际地,使用 concurrent collections。
但是,多线程不是乱搞和随机尝试事情的好地方。这很容易导致很难重现的错误。即使对于经验丰富的程序员来说,多线程也很困难,您应该对 deadlocks and race conditions before trying to use multi threading. See also asynchronous programming and DataFlow 等潜在危险有相当好的了解,部分这样做是为了避免线程之间手动同步的需要。