0
我有這樣的代碼:C#字典指數數組的邊界之外,具有鎖定
lock (dict)
{
dict.Add(someKey, someValue);
Task task = new Task (() => doSomething);
task.Start();
task.ContinueWith(() => {dict.Remove(someKey);});
}
既然我已經在字典鎖,爲什麼我仍然得到錯誤
「索引超出了陣列的範圍「
我不能重現錯誤,但是另一個人做了。
在您開始任務後立即釋放鎖具,並且讀取方式如下:任務內的代碼對於字典不是線程安全的。即使它們是同步的......每個線程鎖定工作。此外,爲什麼你開始這項任務,然後添加延續,而不是反之亦然?最後說明:IndexOutOfRangeException與字典完全無關然後它來自別的 –
嗨Adriano,從堆棧跟蹤,異常來自dict.Add(),這就是爲什麼我相信它與Dictionary有關。 –
向我們展示堆棧跟蹤! Add()_may_如果字典是同時更新的,但是從你發佈的代碼只是同步的(除非你反覆調用那段代碼,那麼是的,有dict.Remove())。無論如何,解決方案是當你刪除時鎖定(作爲回答現在刪除顯示) –