Я продолжаю получать исключение из памяти в следующем коде, и мне было интересно, есть ли что-то, что я мог бы сделать, чтобы это не произошло.Исключение из памяти исключений из памяти
private static List<string> MyIds { get; set; }
private static object LockObject { get; set; }
private static int Counter { get; set; }
private static readonly NumOfThreads = 5;
static void Main(string[] args)
{
try
{
Console.Clear();
LockObject = new object();
// Pull id's into memory (A list of around 1 million ids)
MyIds = _repository.GetIds();
for (int i = 0; i < NumOfThreads ; i++)
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), (object)i);
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
public static void DoWork(Object stateInfo)
{
while (MyList.Count > 0)
{
lock (LockObject)
{
if (MyList.Count == 0)
return;
string id = MyList[0];
var record = _repository.GetRecord(id);
_repository.Add(record);
Counter++;
if (Counter % 100 == 0)
System.Console.WriteLine(DateTime.Now + " - Imported " + Counter.ToString() + " Records..");
MyList.RemoveAt(0);
}
}
}
Спасибо за любую помощь
Немного наблюдений, не связанных с OOM. 1. Вы сериализуете доступ ко всему коду в DoWork, поэтому нет смысла использовать несколько потоков. 2. Вы не используете переданное значение stateInfo. 3. Вы получаете доступ к MyList за пределами блокировки, поэтому этот доступ не является потокобезопасным. –