我希望这是一个非常简单的示例,但是...

    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流向同级?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37306203/

    10-10 08:55