【发布时间】:2018-02-02 08:24:39
【问题描述】:
我正在使用 C#,我有一个枚举器,我正在按顺序读取枚举器内的数据。
这是第三方库对象,不支持 Parallel.Foreach
while(enumerator.Next())
{
var item = enumerator.Read();
ProcessItem(item);
}
ProcessItem(Item item)
{
// Is lock required here
if(item.prop == "somevalue")
this._list.Add(item);
}
我想在阅读内容的同时在这里实现多线程。
while(enumerator.Next())
{
// This code should run in a multi-threaded way
var item = enumerator.Read();
// ProcessItem method puts these items on a class level list property
// Is there any Lock required?
ProcessItem(item);
}
我是多线程的新手。请分享任何满足上述要求的代码示例。
【问题讨论】:
-
你的意思是
ProcessItem(item)做了类似_list.Add(item)的事情吗?根据_list类型,它需要锁定。如果您扩展一些细节,它将有所帮助(显示 ProcessItem 的代码) -
是的,根据某些条件,它会在列表中添加一些项目。例如:If(item.prop == "something") then _list.Add(item);
-
codeproject 中的示例可能不是您需要的。我不建议使用它,不仅因为它违反了宪兵
DoNotUseLockedRegionOutsideMethodRule规则(不仅是这条规则)。据我了解,我将使用带有锁定的IEnumerator的自定义实现来获取对象。但这也取决于ProcessItems的实际实现,如 Ashkan Nourzadeh 所述。随着请求更改其枚举中的列表,代码可能非常复杂,我想说,您应该搜索另一种方式,而不更改列表。
标签: c# multithreading locking