我有多个线程创建一个public List<List<String>> listOfLists
并用数据填充它。完成所有线程后,我想使用主线程list.AddRange()
中多个线程中的所有这些列表进行组合listOfLits
。
所以,如果我有三个线程并且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
}
}