【发布时间】:2020-08-31 10:19:18
【问题描述】:
我的程序有 2 个主线程:
-
Thread checkForNewItemsThread将新对象添加到volatile List<Object> -
Thread workOnListThread在List<Object>上工作,并为列表中需要工作的每个项目创建另一个新的Thread doWorkThread。
我在workOnListThread 期间遇到了 ArgumentNull 异常,因为(我认为正在发生的事情):
- 我的
checkForNewItemsThread正在添加到列表中,而workOnListThread正在遍历列表。 - 我的
doWorkThread正在从列表中删除该项目,一旦它完成了对该对象的处理。
我认为正确的做法是在workOnListThread 正在处理列表时锁定List<Object>,但是,我很难确定锁定的正确位置List<Object>,我认为这应该是正确的,但是可以使用一些指导。
volatile List<Object> List1 = new List<Object>();
private static readonly object _lock = new object();
Thread checkForNewItemsThread;
Thread workOnListThread;
Thread doWorkThread;
public void OnTimerCheckNewItems(object sender, ElapsedEventArgs args)
{
List<Object> List1Temp = new List<Object>();
List1Temp = getList();
addNewItems(List1Temp);
}
private void addNewItems(List<Object> list)
{
foreach (Object obj in list)
{
if (!List1.Any(o => o.ID == obj.ID)) //check if object already exists
{
List1.Add(obj);
}
}
}
private void workOnList()
{
while (true) //loop forever
{
while (List1.Count != 0) //while items exist
{
lock (_lock) //lock while iterating through list
{
try
{
for (int i = 0; i < List1.Count; i++)
{
if (List1[i].Status == Status.ready && List1[i] != null)
{
doWorkThread = new Thread(() => doWork(List1[i]));
doWorkThread.Start();
Thread.Sleep(3000); // wait for process to start
}
}
}
catch (Exception e)
{
Console.WriteLine(DateTime.Now.ToString(), " : ", e);
Log(e.ToString());
}
}
}
}
}
private void doWork(Object obj)
{
lock (_lock) //lock during update to status
{
int i = List.IndexOf(obj);
List1[i].Status = Status.pending;
}
//work done here
List1.Remove(alert);
}
【问题讨论】:
-
看看这个关于 C# 多线程的优秀资源:albahari.com/threading
标签: c# multithreading locking volatility