C#使用CallContext缓存线程数据
CallContext类是一个建议性的机制,可以在跨越异步点的执行上下文中传递状态,CallContext可以以独立于特定线程的方式存储数据。在异步处理程序和其他不同的执行上下文中使用CallContext类存储操作上下文信息(例如用户身份、性能跟踪信息和其他逻辑相关的信息),可以在各种环境中很方便地访问信息。
CallContext 所有有关的数据都是存储在线程上下文中的,所以不会跨越线程传递。一些常见的操作上下文类如 HttpContext、OperationContext 和 CallContext 都使用 CallContext 来跨线程携带信息。
步骤一:使用CallContext类在获得数据后把它缓存到当前线程中
可以使用 CallContext 类将当前线程中的全局或易失数据关联起来。关联数据后,可以在该线程的任何位置访问该数据,并且可以使用不同于堆上缓存 Storage 时要使用的方法列表。
CallContext.LogicalSetData()方法用于将变量放入线程特定的数据槽中。
代码示例:
CallContext.LogicalSetData("UserName", "John");
步骤二:通过CallContext类获取缓存的数据
使用CallContext类获取缓存数据需使用CallContext.LogicalGetData()方法,它会从线程特定的数据槽中获取变量的值。调用方法LogicalSetData()和 LogicalGetData()必须成对出现,否则有可能发生内存泄漏。
代码示例:
string userName = (string) CallContext.LogicalGetData("UserName");
示例一:在Thread中使用CallContext缓存数据
在以下代码示例中,我们在主线程中将“UserName”放置于CallContext中,并创建了一个新的线程。在新线程中,我们获取保存在CallContext中的用户名。
代码示例:
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System;
class Example
{
static void Main()
{
string userName = "Leslie";
Console.WriteLine("1. Main thread, user = {0}", userName);
// Save the data and create the thread.
CallContext.LogicalSetData("UserName", userName);
Thread newThread = new Thread(ThreadMethod);
newThread.Start();
newThread.Join();
// Retrieve the data.
string reply = (string) CallContext.LogicalGetData("UserName");
Console.WriteLine("\n1. Main thread, user = {0}", reply);
}
static void ThreadMethod()
{
// Retrieve the data
string userName = (string) CallContext.LogicalGetData("UserName");
Console.WriteLine("\n2. Second thread, user = {0}", userName);
// Change the data and store it again.
CallContext.LogicalSetData("UserName", "Anne");
userName = (string) CallContext.LogicalGetData("UserName");
Console.WriteLine("\n3. Second thread, user = {0}", userName);
}
}
输出结果:
1. Main thread, user = Leslie
2. Second thread, user = Leslie
3. Second thread, user = Anne
1. Main thread, user = Leslie
示例二:使用CallContext类传递身份验证Token
以下示例演示了使用CallContext类在线程间传递身份验证Token的方法。身份验证Token是一种通过API访问外部服务的一种方法,该方法需将请求中的任何与身份验证Token相关的信息与消息一起传输。在以下示例中,身份验证Token是“Token123”并存储在CallContext中,然后使用Task.Run异步执行工作。在异步工作中,从CallContext获取Token并获取授权。
代码示例:
using System;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Threading.Tasks;
class Example
{
static void Main(string[] args)
{
CallContext.LogicalSetData("Token", "Token123");
Console.WriteLine("Main thread {0} with Identity {1}",
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.ManagedThreadId);
Task.Run(() => {Work();} ).Wait();
Console.WriteLine("Main thread {0} done. Press Enter.",
Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
}
static void Work()
{
Console.WriteLine("Work thread {0} with Identity {1}",
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Authorized with token '{0}'",
CallContext.LogicalGetData("Token"));
}
}
输出结果:
Main thread 1 with Identity 1
Work thread 5 with Identity 5
Authorized with token 'Token123'
Main thread 1 done. Press Enter.
以上就是关于C#使用CallContext缓存线程数据的完整攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用CallContext缓存线程数据 - Python技术站