我有一个mainthread,我确实创建了另一个n线程.每个n线程都填充了一个List<String>.当所有线程都完成后,它们会被连接起来,我希望所有那些n线程List都在主线程中的List<List<String>>BUT中.主线程应该能够对此进行操作List<List<String>>.每个n线程贡献了一个List<String>.
我有c#.NET 3.5,我想避免一个 static List<List<String>>
Thread t = new Thread(someObjectForThreading.goPopulateList);
list_threads.Add(t);
list_threads.last().start()
Run Code Online (Sandbox Code Playgroud)
list_threads中的所有线程都会继续并填充它们的List,当它们完成时我希望有类似的东西
//this = mainThread
this.doSomethingWith(List<List<String>>)
Run Code Online (Sandbox Code Playgroud)
编辑:嗯,没有一个"标准概念"如何解决这样的任务?许多线程在列表上运行,当所有线程都加入时,mainthread可以继续在列表上运行.
EDIT2:在List<List<String>> listOfLists一定不能是静态的.它可以public or private.首先,我需要n线程来操作(并锁定)listOfLists,插入它们的List,并且在完成插入列表的所有n线程之后,我将加入线程并且mainthread可以继续使用businesslogic并在listOfLists
我想我会重新阅读http://www.albahari.com/threading/报告的部分内容
这是一个使用等待句柄(在ManualResetEvent的情况下)的简单实现,允许每个工作线程向主线程发信号通知它完成了它的工作.我希望这有点自我解释:
private List<List<string>> _listOfLists;
public void CreateListOfLists()
{
var waitHandles = new List<WaitHandle>();
foreach (int count in Enumerable.Range(1, 5))
{
var t = new Thread(CreateListOfStringWorker);
var handle = new ManualResetEvent(false);
t.Start(handle);
waitHandles.Add(handle);
}
// wait for all threads to complete by calling Set()
WaitHandle.WaitAll(waitHandles.ToArray());
// do something with _listOfLists
// ...
}
public void CreateListOfStringWorker(object state)
{
var list = new List<string>();
lock (_listOfLists)
{
_listOfLists.Add(list);
}
list.Add("foo");
list.Add("bar");
((ManualResetEvent) state).Set(); // i'm done
}
Run Code Online (Sandbox Code Playgroud)
请注意,当我将每个线程的List添加到列表的主列表时,我只是锁定.没有必要为每个添加锁定主列表,因为每个线程都有自己的List.合理?
编辑:
使用等待句柄的目的是在处理列表列表之前等待每个线程完成.如果您不等待,那么当工作者仍在向其添加字符串时,您可能会尝试枚举其中一个List实例.这将导致抛出InvalidOperationException,并且您的线程将会死亡.您无法枚举集合并同时对其进行修改.