1

这可能是一个愚蠢的问题,但我是否需要使用和分配锁,或者我可以简单地返回结果。

例如:

我有一个私有帮助方法,它返回一个 IEnumerable 文件名列表。它使用锁来确保该方法在迭代 m_transfers 集合时是线程安全的。

需要任务吗...

IEnumerable<String> updated;
lock (m_transfers.Lock)
{
    updated = m_transfers.Values.Where(transfer => transfer.Updated)
                         .Select(transfer => transfer.Filename);
}
return updated;

或者我可以做

lock (m_transfers.Lock)
{
    return updated = m_transfers.Values.Where(transfer => transfer.Updated)
                            .Select(transfer => transfer.Filename);
}
4

3 回答 3

3

不,您不需要添加额外的变量;无论哪种方式,语义都是相同的,因为在任何一种情况下,我们只有在放弃锁后才真正返回值。

由于该变量没有任何用途,因此我将其删除并使用第二个版本-尽管从技术上讲,编译器实际上还是将其放回原处(alock涉及try/ finally,并且在 IL 级别,您不能ret从 a try;所以编译器实际上像你的第一个版本一样编写它)。

于 2012-09-12T11:18:26.083 回答
1

就像在 , 的情况下您不必这样做一样tryusing您不必在此处执行此操作。编译器在函数退出时为您放置所需的代码位。

检查此以获取更多信息:监视器与锁定

于 2012-09-12T11:18:17.510 回答
0

两者都是有效的。
一旦你返回执行就会从块中出来。

于 2012-09-12T11:18:05.937 回答