这可能是一个愚蠢的问题,但我是否需要使用和分配锁,或者我可以简单地返回结果。
例如:
我有一个私有(private)辅助方法,它返回一个 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);
}
请您参考如下方法:
不,您不需要添加额外的变量;无论哪种方式,语义都是相同的,因为在任何一种情况下,我们都只会在释放锁后实际上返回值。
由于该变量没有用处,我会删除它并使用第二个版本 - 虽然技术上,编译器实际上将它放回原处(一个锁 涉及 try/finally,在 IL 级别,您不能从 try 中ret;所以编译器实际上像你的第一个版本一样编写它)。
