访问线程本地存储

本文关键字:存储 线程 访问 | 更新日期: 2023-09-27 17:53:59

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

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()

谢谢。

访问线程本地存储

您试图用相同的名称分配两次插槽。您可能希望阅读一下MSDN文档。

Update:您应该只分配一次插槽-在启动线程之前。在主程序中进行。现在,每次线程启动时,你都要这样做,这就是为什么你会得到异常。

这里有文档说明。基本上你用错了。命名槽不能分配两次:

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