【发布时间】:2010-12-14 06:35:54
【问题描述】:
我不断收到以下代码的内存不足异常,我想知道是否可以采取一些措施来阻止这种情况的发生。
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,因此这种访问不是线程安全的。
标签: c# .net threadpool out-of-memory