我是多线程的新手,过去只玩过它.但我很好奇是否有可能在主线程上有一个字节数组列表,并且仍然能够在单独的线程中创建新的字节数组时添加到该列表.此外,我将使用for-each循环,它将遍历将用于解析为字节数组的表单列表.所以基本上伪代码就像这样……
- reports = new List();
- foreach (form in forms)
- {
- newReport = new Thread(ParseForm(form));
- reports.Add(newReport);
- }
- void ParseForm(form)
- {
- newArray = new byte[];
- newArray = Convert.ToBytes(form);
- return newArray;
- }
解决方法
如果需要从多个线程访问集合,则应使用同步,或者如果.NET版本为3.0或更高版本,则使用
SynchronizedCollection
.
以下是使线程可以访问集合的一种方法:
- SynchronizedCollection reports = new SynchronizedCollection();
- foreach (form in forms) {
- var reportThread = new Thread(() => ParseForm(form,reports));
- reportThread.Start();
- }
- void ParseForm(Form form,SynchronizedCollection reports) {
- newArray = new byte[];
- newArray = Convert.ToBytes(form);
- reports.Add(newArray);
- }
如果您使用的是.NET 4或更高版本,则可以通过System.Threading.Tasks
命名空间的各种类来更好地替代手动管理线程.在决定线程实现之前,请考虑探索此替代方案.