例如,我有這樣的代碼:如何使用ImmutableList <>來代替List <>來獲得線程安全性?
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var lst =new List<int>();
for (int i = 0; i < 2000000; i++)
{
lst.Add(i);
}
new Thread(() =>
{
for (int i = 20000001; i < 21000000; i++)
{
lst.Add(i);
}
}).Start();
new Thread(() =>
{
lst.Where(item =>
item > 85200 && item < (50000 * (item + 154896556) * 2/1000)
).ToList();
}).Start();
new Thread(() =>
{
for (int i = 21000001; i < 22000000; i++)
{
lst.Add(i);
}
}).Start();
}
}
}
和我得到這個異常(附加信息:集合已修改;枚舉操作可能不會執行。),因爲我在一個線程LST變化,在另一個線程迭代。 這是我的問題:如何重寫此代碼通過System.Collections.Immutable.ImmutableList <>而不是列表<>?
考慮使用ConcurrentBag不是List 的。列表不是線程安全,而ConcurrentBag是。 –
ImmutaleList呢? –