在同步环境中,很容易创建一个作用域上下文,它允许您将带外上下文附加到当前线程。这方面的示例是当前的 TransactionScope 或线程静态日志记录上下文。
using (new MyContext(5))
Assert.Equal(5, MyContext.Current);
Assert.Equal(null, MyContext.Current);
使用IDisposable 和线程静态字段的组合很容易实现上下文。
显然,这在使用异步方法时会分崩离析,因为上下文是基于线程静态字段的。所以,这失败了:
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 一直传递到调用堆栈。
谢谢你的帮助!