怎么设置当前线程的共享数据

如何设置当前线程的共享数据?
http://www.cnblogs.com/zhujiechang/archive/2008/11/03/1325828.html


  具体一点说就是在当前线程中设置指定数据并在当前线程内共享该数据,最主要的问题是该数据仅仅共享于当前的线程,线程间只会取得属于该线程的共享数据,举 个例子来说明这样的应用,最典型的示例就是HttpContext.Current这个应用,这个对象是在Web中经常用到的一个对象,通过一个静态方法 获得属于当前的HttpContext对象,Web的每一个Request请求都是单独的处于不同线程中,那么他们之间的Request等对象都是仅限于 当前线程中使用,通过这种方法使得各个Request之间互相独立,互相不受到影响,编写程序也非常的方便,这样的应用在Win32平台也是非常之多,下面来讲讲那么它在.NET下是如何实现的。
     首先第一个用到的类是Thread这个类,第二个类是LocalDataStoreSlot,是一个数据槽类,通过Thread这个类的两个静态方法使得他们联系在一起,分别是SetData (LocalDataStoreSlot slot, 
   Object data)和GetData (LocalDataStoreSlot slot).

引用下MS的示例来详细说明一下:

Code
using System;
using System.Threading;

class Test
{
    static void Main()
    {
        Thread[] newThreads = new Thread[4];
        for(int i = 0; i < newThreads.Length; i++)
        {
            newThreads[i] = new Thread(
                new ThreadStart(Slot.SlotTest));
            newThreads[i].Start();
        }
    }
}
class Slot
{
    static Random randomGenerator;   //这个随机数做示例用的,可以是静态也可以不是,主要是为了使数据不同而设置的
    static LocalDataStoreSlot localSlot; //这个地方要求static的静态对象,一个数据槽

    static Slot()
    {
        randomGenerator = new Random();       
        //在所有的线程上分配未命名的数据槽,这个地方还是比较重要的,获得新的数据槽的方式,
        //可以理解为一个新的实例化,不过产生时确保它是有效的(未使用过的)
        localSlot = Thread.AllocateDataSlot();
    }

    public static void SlotTest()
    {
        // Set different data in each thread's data slot.
        Thread.SetData(localSlot, randomGenerator.Next(1, 200)); //当前线程上分配一个数

        // Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(localSlot).ToString());    //只会获得当前线程上的那个数,注意这里传入的是共有的数据槽

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to the thread.
        //为了看清楚,我调整了一下这里,这时线程之间的执行顺序是随机的
        Thread.Sleep(randomGenerator.Next(200, 1000));   

        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(localSlot).ToString());
            //依然是只会获得自己线程上所共享的那个数据,相当于HttpContext.Current
    }
}
类似这样的应用被广泛应用的很多框架上,是一项很简单实用的方法。

虽然很简单,但是实际上很多人都直接使用HashTable来实现类似的应用,其实MS已经帮我们准备好了很多东西,欢迎大家拍砖。