次の例では、メソッドは 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");
}
それぞれのパフォーマンスとスレッドの安全性に関して、どのような影響がありますか?