相关疑难解决方法(0)

记忆障碍发生器

阅读Joseph Albahari的线程教程,以下内容被提及为内存障碍的生成器:

  • C#的lock陈述(Monitor.Enter/ Monitor.Exit)
  • Interlocked班上的所有方法
  • 使用线程池的异步回调 - 包括异步委托,APM回调和任务延续
  • 设置和等待信令构造
  • 任何依赖于信令的东西,例如启动或等待任务

此外,Hans Passant和Brian Gideon 补充了以下内容(假设其中没有一个已经符合以前的类别之一):

  • 启动或唤醒线程
  • 上下文切换
  • Thread.Sleep()

我想知道这个清单是否完整(如果完整清单甚至可以实际制作)

编辑补充建议:

  • 易失性(读数意味着获取围栏,写作意味着释放围栏)

c# memory-barriers

24
推荐指数
2
解决办法
4193
查看次数

在任何情况下,异步等待方法中的对象更改是否在完成后可见?

在任何情况下,异步/等待方法中的对象更改在完成后是否可见?

经过大量调查后,我仍然无法找到明确的声明,如果在任何情况下完成 await 后,从异步等待方法内部对外部对象所做的更新是否对正在进行的代码可见。

代码示例是某种过滤器链,其中每个过滤器都应该看到先前过滤器所做的任何更改。之后,相同的对象将用于进一步处理。

过滤器不会并行执行。除此之外,由于性能原因,我不想克隆对象。

请参阅以下代码示例:

class Program
{
    private List<ICallback> _allCallbacks = new List<ICallback>();

    public Program()
    {
        // Setup callbacks, perhaps by dependency injection
        _allCallbacks.Add(new MyCallback1());
        _allCallbacks.Add(new MyCallback2());
    }

    static async Task Main()
    {
        Program p = new Program();
        await p.RunBusinessLogic();
        Console.ReadLine();
    }

    private async Task RunBusinessLogic()
    {
        MyDto dto = new MyDto();

        // Setting initial value
        dto.TestProperty = "start";

        // Execute all callbacks and await completion
        await ExecuteCallbacks(dto).ConfigureAwait(false);

        // *** Is dto.TestProperty always guaranteed to …
Run Code Online (Sandbox Code Playgroud)

.net c# memory-model async-await .net-core

2
推荐指数
1
解决办法
218
查看次数