访问线程本地存储

时间:2011-04-29 08:07:20

标签: c# multithreading thread-local-storage

当第二个线程执行时,会导致异常。你能解释一下原因吗?

class TLS
{
    public void Run()
    {
        lock (this)
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " started.");
            LocalDataStoreSlot ldss = Thread.AllocateNamedDataSlot("unique"); // Exception
            Thread.SetData(ldss, "some_data");
            string a = Thread.GetData(ldss) as string;
            Thread.Sleep(1000);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " ended.");
        }
    }
}

异常详细信息:

at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) at System.LocalDataStoreMgr.AllocateNamedDataSlot(String name) at ConsoleApplication2.TLS.Run() in AutoLock.cs:line 65 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

感谢。

2 个答案:

答案 0 :(得分:3)

您正尝试两次分配具有相同名称的插槽。您可能希望阅读MSDN documentation

更新:在启动线程之前,您应该只分配一次插槽。在主程序中执行此操作。现在,每次线程启动时都会执行此操作,这就是您获得异常的原因。

答案 1 :(得分:0)

记录here。你基本上是以错误的方式使用它。您不能两次分配命名槽:

  

如果是AllocateNamedDataSlot方法   使用时,应该在主要调用   程序启动时的线程,因为它   如果有一个插槽,则抛出一个异常   指定的名称已经存在   分配。没有办法测试   槽是否已经存在   分配