正确操作 IEnumerable<foo>
Proper manipulation of IEnumerable<foo>
按照我之前的 。
在多线程程序中,不同的线程各自生成很长的结果列表。当线程完成它的任务时,我想 Concatenate 不同的列表到一个列表中。请注意以下事项:
public struct AccEntry
{
internal AccEntry(int accumulation)
: this()
{
Accumulation = accumulation;
}
public int Accumulation { private set; get; }
}
internal class Functions
{
internal Functions(Object lockOnMe, IEnumerable<AccEntry> results)
{
_lockOnMe = lockOnMe;
_results = results;
_result = new List<AccEntry>();
}
private IEnumerable<AccEntry> _results { set; get; }
private List<AccEntry> _result { set; get; }
internal void SomeFunction()
{
/// some time consuming process that builds _result
lock(_lockOnMe)
{
/// The problem is here! _results is always null.
if (_results == null) _results = _result;
else _results = _results.Concat(_result);
}
}
}
public class ParentClass
{
public void DoJob()
{
IEnumerable<AccEntry> results = null;
/// initialize and launch multiple threads where each
/// has a new instance of Functions, and call SomeFunction.
}
}
如代码中所述,问题在于 _results 始终为 null。当线程更改将其设置为 _result 时,另一个线程再次找到它 null 。我还尝试在 Functions 构造函数中为 results 使用 ref 关键字,但它没有改变任何东西。
假设以下代码按预期执行,我想知道我在上述代码中漏掉了什么?!!
List<int> listA = new List<int>();
List<int> listB = new List<int>();
listA.Add(10);
listB.Add(12);
IEnumerable<int> listC = null;
listC = listA;
listC = listC.Concat(listB);
当您连接项目并将其分配回 _results
变量时,这将替换您分配给变量的原始值。新的项目集合将是该实例的本地集合。
与其使用必须替换才能更新的 IEnumerable<>
,不如使用可以将项目添加到适当位置的 List<>
:
internal class Functions
{
internal Functions(Object lockOnMe, List<AccEntry> results)
{
_lockOnMe = lockOnMe;
_results = results;
_result = new List<AccEntry>();
}
private object _lockOnMe;
private List<AccEntry> _results;
private List<AccEntry> _result;
internal void SomeFunction()
{
/// some time consuming process that builds _result
lock(_lockOnMe)
{
_results.AddRange(_result);
}
}
}
只需确保在创建 Functions
个实例之前创建列表。
按照我之前的
在多线程程序中,不同的线程各自生成很长的结果列表。当线程完成它的任务时,我想 Concatenate 不同的列表到一个列表中。请注意以下事项:
public struct AccEntry
{
internal AccEntry(int accumulation)
: this()
{
Accumulation = accumulation;
}
public int Accumulation { private set; get; }
}
internal class Functions
{
internal Functions(Object lockOnMe, IEnumerable<AccEntry> results)
{
_lockOnMe = lockOnMe;
_results = results;
_result = new List<AccEntry>();
}
private IEnumerable<AccEntry> _results { set; get; }
private List<AccEntry> _result { set; get; }
internal void SomeFunction()
{
/// some time consuming process that builds _result
lock(_lockOnMe)
{
/// The problem is here! _results is always null.
if (_results == null) _results = _result;
else _results = _results.Concat(_result);
}
}
}
public class ParentClass
{
public void DoJob()
{
IEnumerable<AccEntry> results = null;
/// initialize and launch multiple threads where each
/// has a new instance of Functions, and call SomeFunction.
}
}
如代码中所述,问题在于 _results 始终为 null。当线程更改将其设置为 _result 时,另一个线程再次找到它 null 。我还尝试在 Functions 构造函数中为 results 使用 ref 关键字,但它没有改变任何东西。
假设以下代码按预期执行,我想知道我在上述代码中漏掉了什么?!!
List<int> listA = new List<int>();
List<int> listB = new List<int>();
listA.Add(10);
listB.Add(12);
IEnumerable<int> listC = null;
listC = listA;
listC = listC.Concat(listB);
当您连接项目并将其分配回 _results
变量时,这将替换您分配给变量的原始值。新的项目集合将是该实例的本地集合。
与其使用必须替换才能更新的 IEnumerable<>
,不如使用可以将项目添加到适当位置的 List<>
:
internal class Functions
{
internal Functions(Object lockOnMe, List<AccEntry> results)
{
_lockOnMe = lockOnMe;
_results = results;
_result = new List<AccEntry>();
}
private object _lockOnMe;
private List<AccEntry> _results;
private List<AccEntry> _result;
internal void SomeFunction()
{
/// some time consuming process that builds _result
lock(_lockOnMe)
{
_results.AddRange(_result);
}
}
}
只需确保在创建 Functions
个实例之前创建列表。