我有2个代码段:
// Snippet 1
int result = await Task.Run(() => LongRunningComputation());
return result;
和
// Snippet 2
int result = 0;
await Task.Run(() =>
{
result = LongRunningComputation();
});
return result;
Snippet 1 100%与Snippet 2相同吗?在读取/写入Snippet 2中的结果时,是否必须使用锁或Volatile.Read/Volatile.Write使其100%等效于Snippet 1?
答案 0 :(得分:2)
他们都做同样的事情,如果这就是你所说的“100%等价”。他们显然不完全一样。
我想说代码段1更可取。这有很多原因,但主要是异步代码本质上是功能性的。如果返回值而不是将共享变量设置为副作用,您会发现简化了方法逻辑。片段1还有其他较小的优点,例如避免因lambda变量捕获而产生的开销。
在这个(简单)示例中,您不必使用锁或volatile。 Task.Run
和await
负责发布内存障碍,因此这个示例可以正常工作。当然,如果你在代理正在执行时有其他代码操纵result
,那么你需要锁定。