Csharp/CSharp Tutorial/Thread/LocalDataStoreSlot

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Thread-local-storage: Named slots

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
public class MainClass
{
    public static void Main()
    {
        Thread.SetData(Thread.AllocateNamedDataSlot("TestSlot"), 126);
        int slotValue2 = (int)Thread.GetData(Thread.GetNamedDataSlot("TestSlot"));
        Console.WriteLine(slotValue2);
    }
}
126

Thread-local-storage: Unnamed slots

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
public class MainClass
{
    public static void Main()
    {
        LocalDataStoreSlot slot = Thread.AllocateDataSlot();
        Thread.SetData(slot, 63);
        int slotValue1 = (int)Thread.GetData(slot);
        Console.WriteLine(slotValue1);
    }
}
63

Thread-static local-storage

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime;
using System.Runtime.rupilerServices;
using System.Security;
using System.Text;
using System.Threading;
public class MainClass
{
    [ThreadStatic]
    private static string threadStaticData = "Empty";
    public static void Main()
    {
        Thread[] threads = new Thread[3];
        for (int i = 0; i < 3; i++)
        {
            threads[i] = new Thread(delegate(object j) {
                threadStaticData = "thread no: " + j;
                Console.WriteLine("[Thread{0}] = {1}", j, threadStaticData);
            });
            threads[i].Start(i);                
        }
        foreach (Thread t in threads)
            t.Join();
        Console.WriteLine("[Master] after loop = {0}", threadStaticData);
    }
}
[Thread0] = thread no: 0
[Thread1] = thread no: 1
[Thread2] = thread no: 2
[Master] after loop = Empty

Use LocalDataStoreSlot

/*
Book Accelerated C# 2005
    * By Trey Nash
    * ISBN: 1-59059-717-6
    * 432 pp.
    * Published: Aug 2006
    * Price: $39.99
*/
using System;
using System.Threading;
public class MyClass
{
    static MyClass() {
        tlsSlot = Thread.AllocateDataSlot();
    }
    public MyClass() {
        Console.WriteLine( "Creating MyClass" );
    }
    public static MyClass MyThreadDataClass {
        get {
            Object obj = Thread.GetData( tlsSlot );
            if( obj == null ) {
                obj = new MyClass();
                Thread.SetData( tlsSlot, obj );
            }
            return (MyClass) obj;
        }
    }
    private static LocalDataStoreSlot tlsSlot = null;
}
public class MainClass
{
    private static void ThreadFunc() {
        Console.WriteLine( "Thread {0} starting...",Thread.CurrentThread.GetHashCode() );
        Console.WriteLine( "tlsdata for this thread is \"{0}\"", MyClass.MyThreadDataClass );
        Console.WriteLine( "Thread {0} exiting", Thread.CurrentThread.GetHashCode() );
    }
    static void Main() {
        Thread thread1 = new Thread( new ThreadStart(ThreadFunc) );
        Thread thread2 = new Thread( new ThreadStart(ThreadFunc) );
        thread1.Start();
        thread2.Start();
    }
}
Thread 3 starting...
Creating MyClass
tlsdata for this thread is "MyClass"
Thread 3 exiting
Thread 4 starting...
Creating MyClass
tlsdata for this thread is "MyClass"
Thread 4 exiting

Use thread-local storage

using System;
using System.Threading;
class MainClass
{
  public static void SetError() 
  {
    Random r = new Random();
    Thread.SetData(Thread.GetNamedDataSlot("Number"), r.Next(100));
    Thread.SetData(Thread.GetNamedDataSlot("Name") ,Thread.CurrentThread.Name);
    Console.WriteLine("Number = " + Thread.GetData(Thread.GetNamedDataSlot("Number")));
    Console.WriteLine("Name = " + Thread.GetData(Thread.GetNamedDataSlot("Name")));
  }
  public static void Main() 
  {
    Thread.AllocateNamedDataSlot("Number");
    Thread.AllocateNamedDataSlot("Name");
    Thread t2 = new Thread(new ThreadStart(SetError));
    t2.Name = "t2";
    t2.Start();
    Thread t3 = new Thread(new ThreadStart(SetError));
    t3.Name = "t3";
    t3.Start();
    Thread.FreeNamedDataSlot("Number");
    Thread.FreeNamedDataSlot("Name");
  }
}
Number = 81
Name = t2
Number = 81
Name = t3