在集合上使用c#中的收益率仍然可以';不要更新我的收藏 静态列表编号=新列表(); 静态void Main(字符串[]参数) { foreach(GetNumbers()中的变量编号) { 如果(数字==1) { 线程t=新线程(()=> { 增加(234567); }); t、 Start(); } 控制台写入线(编号); } } 公共静态IEnumerable GetNumbers() { 对于(inti=0;i
即使你在使用收益率,你也在使用收益率内部 声明: 对一个列表执行多个读取操作是安全的,但是 如果在读取集合时对其进行修改,则可能会出现问题 这是这里最基本的问题——你在给它写信的时候正在阅读这个收藏(正如foreach所证明的那样)。这是不允许的 这可能值得一读:在集合上使用c#中的收益率仍然可以';不要更新我的收藏 静态列表编号=新列表(); 静态void Main(字符串[]参数) { foreach(GetNumbers()中的变量编号) { 如果(数字==1) { 线程t=新线程(()=> { 增加(234567); }); t、 Start(); } 控制台写入线(编号); } } 公共静态IEnumerable GetNumbers() { 对于(inti=0;i,c#,multithreading,linq,ienumerable,yield-return,C#,Multithreading,Linq,Ienumerable,Yield Return,即使你在使用收益率,你也在使用收益率内部 声明: 对一个列表执行多个读取操作是安全的,但是 如果在读取集合时对其进行修改,则可能会出现问题 这是这里最基本的问题——你在给它写信的时候正在阅读这个收藏(正如foreach所证明的那样)。这是不允许的 这可能值得一读: 您可能想考虑使用并发包、并发队列或并发堆栈作为备选方案。 ,即使您使用的是收益率,您也在使用它内前文。< /P> 声明: 对一个列表执行多个读取操作是安全的,但是 如果在读取集合时对其进行修改,则可能会出现问题 这是这里最基本的问题—
您可能想考虑使用并发包、并发队列或并发堆栈作为备选方案。
,即使您使用的是收益率,您也在使用它<强>内<强>前文。< /P> 声明: 对一个列表执行多个读取操作是安全的,但是 如果在读取集合时对其进行修改,则可能会出现问题 这是这里最基本的问题——你在给它写信的时候正在阅读这个收藏(正如foreach所证明的那样)。这是不允许的 这可能值得一读:您可能想考虑使用并发包、并发队列或并发堆栈作为备选方案。
需要将对象和实例发送到线程。因此使用Stask.BeginInvoke(StestObjor)应该使你的代码不是线程安全的,所以修复产量问题是徒劳的。你确实提供了一个很好的MCVE,但幸运的是,这是一个。尝试描述在你的实际情况下的约束。而不是使用<代码>列表< /代码>,你可能想考虑使用<代码>队列< /代码>(<代码> CONTRONGROUND队列)。。您可以通过使用Pop
对队列进行迭代来测试队列中是否有新项目,消费者可以Push
对队列进行更改:您需要将对象的和实例发送到线程。因此,请使用start.BeginInvoke(stateobject)应该使你的代码不是线程安全的,所以修复产量问题是徒劳的。你确实提供了一个很好的MCVE,但幸运的是,这是一个。尝试描述在你的实际情况下的约束。而不是使用<代码>列表< /代码>,你可能想考虑使用<代码>队列< /代码>(<代码> CONTRONGROUND队列)。。您可以使用Pop
对队列进行迭代时测试队列中是否有新项目,消费者可以Push
对队列进行更改:这是否有助于@YogeshJoshi?这是否有助于@YogeshJoshi?
static List<int> numbers = new List<int>();
static void Main(string[] args)
{
foreach(var number in GetNumbers())
{
if (number == 1)
{
Thread t = new Thread(() =>
{
numbers.Add(234567);
});
t.Start();
}
Console.WriteLine(number);
}
}
public static IEnumerable<int> GetNumbers()
{
for(int i =0; i <=10;i++)
{
numbers.Add(i);
}
foreach (var number in numbers)
{
yield return number;
}
}