【发布时间】:2012-09-06 20:02:19
【问题描述】:
我有多个线程创建一个public List<List<String>> listOfLists 并用数据填充它。完成所有线程后,我想使用list.AddRange() 将主线程listOfLits 中多个线程中的所有这些列表组合起来。
所以,如果我有 3 个线程并且每个线程的 listOfLists 有 10 个元素,那么主线程的 listOflists 将有 30 个元素。只需简单地添加它们,主线程对象必须具有线程插入的所有数据。
如果我将static 关键字用于listOfLists,它会完美运行。我只想摆脱static。
这是一个小例子。
- 我创建了一个简单的 Person 对象(主线程)
- 主线程调用方法创建3个线程
- 这些线程中的每一个都调用另一个方法来用数据填充自己的
listOfLists - 在该方法结束时,我将自己的线程
listOfLists添加到static listOfLists - 这就是我想要避免的。不能有任何静态。
- 我只想让这些线程数据在我的主线程中可用,并在主线程上继续应用程序。
编辑:它必须是 .NET 3.5
Edit2:一种解决方案似乎是在启动线程时提供 listOfLists(主线程)的引用作为参数。有没有其他方法可以解决这样的线程问题?
namespace Threading
{
class Program
{
static void Main(string[] args)
{
Person p = new Person("mainThread");
p.startMultiThreading();
}
}
class Person
{
public String name;
public List<String> privatePet;
public List<List<String>> listOfLists = new List<List<string>>();
public static List<List<String>> familyPets = new List<List<string>>();
public Person(String n) { name = n; } //constructor
public Person() { }
public void startMultiThreading()
{
List<Thread> list_threads = new List<Thread>();
for (int i = 0; i < 3; i++)
{
Person multiThreadPerson = new Person("multi: " + i); //create new Person
Thread t = new Thread(multiThreadPerson.fill_List); //create new Thread
t.Name = multiThreadPerson.name; //name the Thread with PersonName
list_threads.Add(t);
list_threads[i].Start(); //new Person is calling fill_list()
}
for (int i = 0; i < list_threads.Count; i++)
{
list_threads[i].Join();
}
familyPets.Add(new List<string>{"this is mainthread again"});
foreach (List<String> list in familyPets)
{
list.ForEach(e => Debug.WriteLine(e));
}
}
public void fill_List()
{
privatePet = new List<string>();
lock (familyPets)
{
for (int i = 0; i < 20; i++)
{
privatePet.Add("dog :" + Thread.CurrentThread.Name);
privatePet.Add("cat :" + this.name);
listOfLists.Add(privatePet);
}
familyPets.AddRange(listOfLists); //adding up all listOfLists to the mainthread listOfLists
}//lock
}
}
【问题讨论】:
标签: c# multithreading list concurrency .net-3.5