相关疑难解决方法(0)

我们如何为异步.net方法创建一个callcontext?

在同步环境中,很容易创建一个范围上下文,允许您将带外上下文附加到当前线程.例如,当前的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一直传递到调用堆栈.

谢谢你的帮助!

.net c# cross-cutting-concerns threadcontext async-await

1
推荐指数
1
解决办法
1227
查看次数