【发布时间】:2014-11-18 17:42:14
【问题描述】:
在同步环境中,很容易创建一个作用域上下文,它允许您将带外上下文附加到当前线程。这方面的示例是当前的 TransactionScope 或线程静态日志记录上下文。
using (new MyContext(5))
Assert.Equal(5, MyContext.Current);
Assert.Equal(null, MyContext.Current);
使用a combination of IDisposable and a thread-static field 很容易实现上下文。
显然,这在使用异步方法时会分崩离析,因为上下文是基于线程静态字段的。所以,这失败了:
using (new MyContext(5))
{
Assert.Equal(5, MyContext.Current);
await DoSomethingAsync();
Assert.Equal(5, MyContext.Current);
}
当然,我们还希望将上下文传递给调用链中的异步方法,所以这应该也可以:
using (new MyContext(5))
{
Assert.Equal(5, MyContext.Current);
await AssertContextIs(5);
}
有人知道如何实现吗?在使用 async/await 模式时丢失带外上下文会使某些代码片段非常难看。
考虑一下您希望使用基于请求的上下文进行日志记录的异步 WebAPI 调用。您希望深入调用堆栈的记录器知道请求 ID,而无需使用参数将请求 ID 一直传递到调用堆栈。
感谢您的帮助!
【问题讨论】:
-
我真的不明白在你的第二个例子中什么不起作用。在
await DoSomethingAsync之后,您仍然处于using语句的上下文中。
标签: c# .net async-await cross-cutting-concerns threadcontext