我是新手。我有一个列表和两个线程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正在向"mycompleteitems"添加项目。但是,甚至在一个项目被添加到列表之前,线程2试图访问列表并抛出"System。参数outtorange异常:索引超出范围。我如何使线程2等待,直到所有项目被添加到线程1列表?
常规列表不是线程安全的,当试图在多个线程中同时使用它时,几乎任何事情都可能发生。
我如何使线程2等待,直到所有的项目被添加到列表的线程1?
如果你想确保两个线程不能同时访问资源,可以使用锁,或者使用manualResetEvent/autoResetEvent来阻塞一个线程,直到另一个线程做某事。
或者更实际一些,使用并发集合。
然而,多线程并不是一个乱做乱试的好地方。这将很容易导致难以复制的bug。即使对有经验的程序员来说,多线程也很困难,在尝试使用多线程之前,您应该对死锁和竞争条件等潜在危险有相当好的了解。另请参见异步编程和DataFlow,它们在一定程度上是为了避免线程之间手动同步的需要。