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: 1 つの解決策は、スレッドの開始時にパラメーターとして (メイン スレッドの) 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
}
}