根据我使用的是基于async/await的代码还是基于TPL的代码,我得到了关于清理逻辑CallContext的两种不同行为。如果我使用以下异步/等待代码,我可以完全按照预期设置和清除逻辑CallContext:classProgram{staticasyncTaskDoSomething(){CallContext.LogicalSetData("hello","world");awaitTask.Run(()=>Debug.WriteLine(new{Place="Task.Run",Id=Thread.CurrentThread.ManagedThreadId,Msg=CallC
对于.NET核心,AsyncLocal是CallContext的替代品.但是,尚不清楚在ASP.NETCore中使用它有多“安全”。在ASP.NET4(MVC5)和更早版本中,thread-agilitymodelofASP.NETmadeCallContextunstable.因此,在ASP.NET中,实现每个请求逻辑上下文行为的唯一安全方法是使用HttpContext.Current.Items。在幕后,HttpContext.Current.Items是用CallContext实现的,但它是以对ASP.NET安全的方式完成的。相比之下,在OWIN/KatanaWebAPI的上下文
对于.NET核心,AsyncLocal是CallContext的替代品.但是,尚不清楚在ASP.NETCore中使用它有多“安全”。在ASP.NET4(MVC5)和更早版本中,thread-agilitymodelofASP.NETmadeCallContextunstable.因此,在ASP.NET中,实现每个请求逻辑上下文行为的唯一安全方法是使用HttpContext.Current.Items。在幕后,HttpContext.Current.Items是用CallContext实现的,但它是以对ASP.NET安全的方式完成的。相比之下,在OWIN/KatanaWebAPI的上下文
CallContextAPI有LogicalGetData和GetData,但是MSDNDocumentation并没有做太多解释两者之间的区别,并且当它们不同时。有什么想法吗? 最佳答案 通常,通过CallContext.SetData存储的数据被认为是线程本地的。也就是说,对CallContext.GetData的任何调用都将从同一线程获取通过SetData设置的数据。通过CallContext.LogicalSetData存储的数据被认为是本地“逻辑线程”。也就是说,通过CallContext.LogicalSetData存储
CallContext和ThreadStatic有什么区别?我了解到,在ASP.NET环境中,存储在CallContext中的数据可以在整个请求期间保持不变,直到它结束,而ThreadStatic可能会或可能不会工作,因为请求可能会切换线程。我还了解到HttpContext是使用CallContext在内部存储的。在常规应用程序中,它们似乎都存在于同一个线程调用中。什么时候不是这样?编辑:在评论中我了解到调用上下文是对线程静态存储的抽象。ASP.NET框架显式地将数据从一个线程移动到下一个线程以处理一个请求。其他想要提供线程敏捷性的框架可以对上下文存储做同样的事情。