c# - 如何让AsyncLocal流向 sibling ?

标签 c# asynchronous async-await task-parallel-library

这是一个非常简单的例子,我希望它能工作但是......

    static AsyncLocal<bool> _value = new AsyncLocal<bool>();

    static void Main(string[] args)
    {
        A().Wait();
    }

    static async Task A()
    {
        await B();
        await C();
    }

    static async Task B()
    {
        _value.Value = true;
    }

    static async Task C()
    {
        if (!_value.Value) throw new Exception();
    }

那么是否有可能以某种方式在方法 B 中存储一些内容,以便在 C 中提供一个值?我需要它仅通过异步流传递(请不要使用 ThreadStatic)。

最佳答案

这就是我的发现:

  • AsyncLocal 仅以一种方式传输 - 从外层到内层异步方法,因此我添加了一个 B_Start 方法,该方法在“顶层”级别初始化本地.
  • 即使对于已经初始化的局部变量,内部方法内部的更改也不会传回,但您可以改变引用类型容器上的字段。

工作代码:

    class Container<T>
    {
        public T Value { get; set; }
    }
    static AsyncLocal<Container<bool>> _value = new AsyncLocal<Container<bool>>();

    static void Main(string[] args)
    {
        A().Wait();
    }

    static async Task A()
    {
        await B_Start();
        await C();
    }

    static Task B_Start()
    {
        _value.Value = new Container<bool>();
        return B();
    }

    static async Task B()
    {
        _value.Value.Value = true;
    }

    static async Task C()
    {
        if (!_value.Value.Value) throw new Exception();
    }

关于c# - 如何让AsyncLocal流向 sibling ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37306203/

相关文章:

c# - 在 ASP.NET 中为特定页面设置无缓存?

javascript - Bluebird promise 多个参数

node.js - 如何在 Node.js 中同步调用

c# - 事件对使用 TaskCompletionSource 的异步方法

c# - 这是获得运行异步任务所需时间的最佳方式吗?

c# - 单个表单中的单独代码 [C#]

c# - Entity Framework 、SQLite 和延迟加载

c# - 如何在 WinCE Compact Framework 3.5 中标记用户控件的默认事件

c# - 创建数千个 Web 请求任务并使用 Task.WhenAll() 等待它们是否安全

c# - WriteableBitmap 的异步操作