Return 来自任务的值

Return a value from a Task

我有 2 个代码片段:

// Snippet 1            
int result = await Task.Run(() => LongRunningComputation());
return result;

// Snippet 2           
int result = 0;
await Task.Run(() =>
{
    result = LongRunningComputation();
});
return result;

代码段 1 是否 100% 等同于代码段 2?我是否必须使用锁或 Volatile。Read/Volatile。当 reading/writing 导致代码段 2 使其 100% 等同于代码段 1 时写入?

如果这就是“100% 等效”的意思,它们都做同样的事情。他们显然不完全一样。

我认为片段 1 更可取。这是出于多种原因,但主要是异步代码本质上是函数式的。如果您 return 值而不是将共享变量设置为副作用,您会发现您的方法逻辑得到了简化。代码片段 1 还有其他一些较小的优点,例如避免因捕获 lambda 变量而产生的开销。

您不必在此(简单)示例中使用锁或 volatile。 Task.Runawait 负责发出内存屏障,所以这个例子可以正常工作。当然,如果您有 other 代码操纵 result 委托正在执行,那么您将需要锁。