2

2番目のスレッドが実行されると、例外が発生します。plsは理由を説明できますか?

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

同じ名前のスロットを2回割り当てようとしています。MSDNのドキュメントを一読することをお勧めします。

更新:スレッドを開始する前に、スロットを1回だけ割り当てる必要があります。あなたのメインプログラムでそれをしてください。現在、スレッドが開始するたびにそれを実行しているため、例外が発生します。

于 2011-04-29T08:11:45.763 に答える
0

ここに文書化されています。基本的に間違った使い方をしています。名前付きスロットを 2 回割り当てることはできません。

AllocateNamedDataSlot メソッドを使用する場合は、プログラムの起動時にメイン スレッドで呼び出す必要があります。これは、指定された名前のスロットが既に割り当てられている場合に例外がスローされるためです。スロットが既に割り当てられているかどうかをテストする方法はありません。

于 2011-04-29T08:14:12.463 に答える