我是否需要使用和分配锁?

时间:2012-09-12 11:15:20

标签: c# .net multithreading linq

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

例如:

我有一个私有帮助器方法,它返回一个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);
}

3 个答案:

答案 0 :(得分:3)

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

由于变量不起作用,我会将其删除并使用第二个版本 - 虽然技术上,编译器实际上会将其重新放回(lock涉及到try / finally,在IL级别,ret内不能try;因此编译器实际上就像你的{{1}}一样第一版)。

答案 1 :(得分:1)

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

点击此处了解详情:Monitor vs lock

答案 2 :(得分:0)

两者都有效。
一旦你返回执行就出现了。