5

在以下示例中,该方法公开为 WCF 服务操作,并且该服务托管在 IIS 中。在进入函数时,WebOperationContext.Current 按预期设置。然而,在等待完成等待后,WebOperationContext.Current 被设置为空。

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

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

        t.Start();

        await t;

        //WebOperationContext.Current is null
    }

这似乎是一个缺点,所以我想知道是否有人意识到这一点,以及是否有任何好的方法来解决它。我意识到我可以在局部变量中缓存对 conext 的引用,但这似乎不太好。

更新

一种有效的方法是

            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 帖子(请注意 Jon Cole 在 MS WCF 团队中)。

同时,您可以捕获变量中的值(这提高了可测试性,这是我推荐的),将其添加到LogicalCallContext,或安装您自己的SynchronizationContext(这会很棘手,因为您托管在使用它自己的 IIS 中SynchronizationContext)。

于 2012-11-08T14:42:47.143 回答