相关疑难解决方法(0)

CallContext与ThreadStatic

CallContext和ThreadStatic有什么区别?

我知道在ASP.NET环境中,存储在CallContext中的数据可以在整个请求中持久存在,直到它结束,而ThreadStatic可能会或可能不会工作,因为请求可能会切换线程.我还了解到HttpContext是使用CallContext在内部存储的.

在常规应用程序中,它们似乎都在同一个线程调用中持久存在.什么时候不是这样的?


编辑:在评论中我了解到调用上下文是线程静态存储的抽象.ASP.NET框架显式地将数据从一个线程移动到下一个处理一个请求的线程.其他想要提供线程敏捷性的框架可以对上下文存储执行相同的操作.

c# asp.net

52
推荐指数
2
解决办法
2万
查看次数

清理TPL中的CallContext

根据我是使用基于异步/等待的代码还是基于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")
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

以上输出如下:

{Place = Task.Run,​​Id = 9,Msg = world}
{Place = Main,Id = 8,Msg =}

注意,Msg =这表明CallContext主线程已被释放且为空.

但是,当我切换到纯TPL/TAP代码时,我无法达到同样的效果......

class Program
{ …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task task-parallel-library async-await

11
推荐指数
2
解决办法
3111
查看次数