CallContext和ThreadStatic有什么区别?
我知道在ASP.NET环境中,存储在CallContext中的数据可以在整个请求中持久存在,直到它结束,而ThreadStatic可能会或可能不会工作,因为请求可能会切换线程.我还了解到HttpContext是使用CallContext在内部存储的.
在常规应用程序中,它们似乎都在同一个线程调用中持久存在.什么时候不是这样的?
编辑:在评论中我了解到调用上下文是线程静态存储的抽象.ASP.NET框架显式地将数据从一个线程移动到下一个处理一个请求的线程.其他想要提供线程敏捷性的框架可以对上下文存储执行相同的操作.
根据我是使用基于异步/等待的代码还是基于TPL的代码,我在逻辑清理方面有两种不同的行为CallContext.
CallContext如果我使用以下async/await代码,我可以完全按照我的预期设置和清除逻辑:
class Program
{
    static async Task DoSomething()
    {
        CallContext.LogicalSetData("hello", "world");
        await Task.Run(() =>
            Debug.WriteLine(new
            {
                Place = "Task.Run",
                Id = Thread.CurrentThread.ManagedThreadId,
                Msg = CallContext.LogicalGetData("hello")
            }))
            .ContinueWith((t) =>
                CallContext.FreeNamedDataSlot("hello")
                );
        return;
    }
    static void Main(string[] args)
    {
        DoSomething().Wait();
        Debug.WriteLine(new
        {
            Place = "Main",
            Id = Thread.CurrentThread.ManagedThreadId,
            Msg = CallContext.LogicalGetData("hello")
        });
    }
}
以上输出如下:
{Place = Task.Run,Id = 9,Msg = world}
{Place = Main,Id = 8,Msg =}
注意,Msg =这表明CallContext主线程已被释放且为空.
但是,当我切换到纯TPL/TAP代码时,我无法达到同样的效果......
class Program
{ …