【发布时间】:2010-11-25 15:24:24
【问题描述】:
我有以下代码:
private Dictionary<object, object> items = new Dictionary<object, object>;
public IEnumerable<object> Keys
{
get
{
foreach (object key in items.Keys)
{
yield return key;
}
}
}
这是线程安全的吗?如果不是,我是否必须在循环周围放置 lock 或 yield return?
这就是我的意思:
Thread1 访问Keys 属性,而 Thread2 将一个项目添加到底层字典。 Thread1 是否受 Thread2 的添加影响?
【问题讨论】:
-
您的第二个示例将锁定,返回一个可枚举然后解锁。您将在解锁后进行迭代。
-
哦,你是对的。我只是注意到这是一个不好的例子。我将编辑问题。
-
只是为了阐明一点:通过锁定实现线程安全是昂贵的,因此除非您明确要求,否则自动锁定每个操作是没有意义的。
-
糟糕:我的意思是
yield-statement 不应隐式锁定,因为在所有情况下都可能不需要线程安全时,您会失去性能。
标签: c# ienumerable yield yield-return