【发布时间】:2012-11-08 13:44:15
【问题描述】:
在以下示例中,该方法公开为 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 的引用,但这似乎不太好。
更新
一种可行的方法是
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");
}
在性能和线程安全方面会产生什么影响?
【问题讨论】:
标签: c# wcf async-await