5

次の例では、メソッドは WCF サービス操作として公開され、サービスは IIS でホストされます。関数に入ると、WebOperationContext.Current が期待どおりに設定されます。ただし、await が待機を終了すると、WebOperationContext.Current は null に設定されます。

        public async Task TestAsync()
    {
        //WebOperationContext.Current is set

        Task t = new Task(()=>Thread.Sleep(10000));

        t.Start();

        await t;

        //WebOperationContext.Current is null
    }

これは欠点のように思われるので、誰かがこれを知っているかどうか、そしてそれを回避する良い方法があるかどうか疑問に思いました. conext への参照をローカル変数にキャッシュできることはわかっていますが、これはうまくいきません。

アップデート

機能する1つのアプローチは

            public async Task TestAsync()
    {
        WebOperationContext ctx = WebOperationContext.Current;

        Task t = new Task(()=>Thread.Sleep(10000));

        t.Start();

        await t;

        //ctx is set        
    }

また、他の人がほのめかしたように、私はこれを行うことができました

        public async Task TestAsync()
    {
        CallContext.LogicalSetData("WebOperationContext.Current", WebOperationContext.Current);

        Task t = new Task(()=>Thread.Sleep(10000));

        t.Start();

        await t;

        WebOperationContext ctx = (WebOperationContext)CallContext.LogicalGetData("WebOperationContext.Current");
    }

それぞれのパフォーマンスとスレッドの安全性に関して、どのような影響がありますか?

4

1 に答える 1

5

WCFチームがの解決策を検討していると聞きましたが、OperationContext.Current彼らもそれに対処することを期待してWebOperationContext.Currentいます。このSOの投稿を参照してください(JonColeはMSWCFチームに所属していることに注意してください)。

それまでの間、値を変数にキャプチャするか(テストのしやすさを向上させ、私がお勧めします)、値をに追加するLogicalCallContextか、独自の値をインストールできますSynchronizationContext(独自のIISでホストされているため、これは注意が必要ですSynchronizationContext)。

于 2012-11-08T14:42:47.143 に答える