Доступ к локальному хранилищу потока - PullRequest
2 голосов
/ 29 апреля 2011

Когда выполняется второй поток, это приводит к исключению. Можете ли вы объяснить, почему?

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 ]

3 голосов
/ 29 апреля 2011

Вы пытаетесь выделить слот с одинаковым именем дважды.Возможно, вы захотите прочитать документацию MSDN .

Обновление : Вы должны распределять слот только один раз - до запуска потоковСделайте это в своей основной программе.Прямо сейчас вы делаете это каждый раз, когда начинается поток, и именно поэтому вы получаете исключение.

0 голосов
/ 29 апреля 2011

Это задокументировано здесь .Вы используете это неправильно в принципе.Вы не можете выделить именованный слот дважды:

Если используется метод AllocateNamedDataSlot, его следует вызывать в главном потоке при запуске программы, поскольку он выдает исключение, если слот с указанным именемуже был выделен.Невозможно проверить, был ли выделен слот.

...