2

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

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

谢谢。

4

2 回答 2

3

您正在尝试两次分配具有相同名称的插槽。您可能想要阅读MSDN 文档

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

于 2011-04-29T08:11:45.763 回答
0

它记录在这里。您基本上以错误的方式使用它。您不能两次分配命名插槽:

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

于 2011-04-29T08:14:12.463 回答