副作用在任务继续中是否总是可见?

问题描述 投票:0回答:1

是否保证副作用在任务继续中可见?

object o = null;
Task.Run (() => o = new object ())
    .ContinueWith (t => o.ToString ());

延续可以在与第一个任务不同的线程上运行。如果没有任何类型的内存隔离区,则对o的分配可能对后续内容不可见。在这种情况下,将抛出NullReferenceException。在上面的示例中,有什么可以防止这种情况的发生?

.net task side-effects
1个回答
0
投票

是否保证副作用在任务继续中可见?

如果那是“在某个地方有来自MS的一些官方文件这样说的话,那么恐怕答案是否定的。”>

[实际上,如果继续操作不能依赖于能够观察到他们继续执行的任务所产生的所有效果,那么继续操作将无用。

.NET Framework 4.8 sourcecore clr都有一个称为FinishContinuations的内部方法,该方法用于查找Task对象具有的延续,并使它们被调度/执行。在这两种实现中,都使用Interlocked.Exchange来获取延续对象,希望您已经意识到这会强加一个完整的内存屏障。

© www.soinside.com 2019 - 2024. All rights reserved.