2016-05-18 20 views
3

これには、値はCで利用できるような方法で方法B内側に何かを格納する可能性があるAsyncLocalフローを兄弟にするにはどうすればいいですか?

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

私が動作することを期待し、非常に簡単な例ですが...?私はそれが非同期フロー(ThreadStaticしてください)だけを通過する必要があります。

+0

はあなたがオプションではありませんなぜ静的について詳しく説明していただけますか? – Karolis

+0

@Carl実際のアプリケーションでは、値はインスタンスフィールドに保持され、別々の非同期フローが入ってくる場合には別々にする必要があります。 – Vlad

+0

'await C(await B());'?とにかくBが戻ってくるまでCは何の仕事もしないからです。 – Karolis

答えて

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

さて、あなたは何をしたいのか分かりました。それを解決するには良い仕事:) – Karolis

+0

'しかし、あなたは参照型コンテナのフィールドを突然変異させることができます。 ' - いいえ、決してこれを行うべきではありません。何もあなたを止めることはありませんが、あなたは苦痛の世界で終わるでしょう。 –

+0

@StephenClearyそれは本当の議論を提供してください。私はすでにこれを使用しています、それだけで動作します。 – Vlad

関連する問題