如何让AsyncLocal流向兄弟姐妹?

时间:2016-05-18 17:14:59

标签: 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请。)

1 个答案:

答案 0 :(得分:3)

所以这就是我发现的:

  • 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();
    }