2012-09-12 84 views
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); 
} 
+0

更重要的是:所有其他访问'm_transfers.Values'是否也被守卫?看起来你可能根本不需要'lock()'。 –

回答

3

不,你并不需要添加额外的变量;语义也是一样的,因为无论哪种情况,我们只有实际上一旦我们放弃了锁定就返回值。

自变量不服务于一个目的,我会删除它,并使用第二个版本 - 虽然技术上,编译器实际上是在放回去反正(一lock涉及try/finally,并在IL级别你不能tryret;所以编译器实际上写它像你的第一个版本)。

+0

感谢您的回复。很好的帮助。 – bobbo

0

都是有效的。只要您返回执行,块就会立即出现在
之后。

1

同样,如果您不需要在try,using的情况下执行此操作,则不必在此处执行此操作。编译器在函数退出时为你提供需要的代码位。

检查本作的详细信息:Monitor vs lock