两个线程尝试访问同一个列表:" System.ArgumentOutOfRangeException"



我是新手。我有一个列表和两个线程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,它们在一定程度上是为了避免线程之间手动同步的需要。

最新更新