在同步环境中,很容易创建一个范围上下文,允许您将带外上下文附加到当前线程.例如,当前的TransactionScope或线程静态日志记录上下文.
using (new MyContext(5))
Assert.Equal(5, MyContext.Current);
Assert.Equal(null, MyContext.Current);
Run Code Online (Sandbox Code Playgroud)
使用IDisposable和线程静态字段的组合可以轻松实现上下文.
显然,当使用异步方法时,这会分崩离析,因为上下文基于线程静态字段.所以,这失败了:
using (new MyContext(5))
{
Assert.Equal(5, MyContext.Current);
await DoSomethingAsync();
Assert.Equal(5, MyContext.Current);
}
Run Code Online (Sandbox Code Playgroud)
当然我们也希望将上下文传递给调用链中的异步方法,所以这也应该有效:
using (new MyContext(5))
{
Assert.Equal(5, MyContext.Current);
await AssertContextIs(5);
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何实现这一点?使用async/await模式时丢失带外上下文会使代码的某些部分变得非常难看.
考虑异步WebAPI调用,您希望将基于请求的上下文用于日志记录.您希望调度堆栈深处的记录器能够知道请求ID,而无需使用参数将整个请求ID一直传递到调用堆栈.
谢谢你的帮助!