2016-04-15 71 views
0

我有這樣的代碼:C#字典指數數組的邊界之外,具有鎖定

lock (dict) 
{ 
    dict.Add(someKey, someValue); 
    Task task = new Task (() => doSomething); 
    task.Start(); 
    task.ContinueWith(() => {dict.Remove(someKey);}); 
} 

既然我已經在字典鎖,爲什麼我仍然得到錯誤

「索引超出了陣列的範圍「

我不能重現錯誤,但是另一個人做了。

+1

在您開始任務後立即釋放鎖具,並且讀取方式如下:任務內的代碼對於字典不是線程安全的。即使它們是同步的......每個線程鎖定工作。此外,爲什麼你開始這項任務,然後添加延續,而不是反之亦然?最後說明:IndexOutOfRangeException與字典完全無關然後它來自別的 –

+0

嗨Adriano,從堆棧跟蹤,異常來自dict.Add(),這就是爲什麼我相信它與Dictionary有關。 –

+0

向我們展示堆棧跟蹤! Add()_may_如果字典是同時更新的,但是從你發佈的代碼只是同步的(除非你反覆調用那段代碼,那麼是的,有dict.Remove())。無論如何,解決方案是當你刪除時鎖定(作爲回答現在刪除顯示) –

回答

0

dict.Remove(someKey);不在鎖內運行。它運行在不同的線程上。此代碼未正確同步。可能你需要的是lock (dick) dict.Remove(someKey);。然後,字典將表現正確。然而,AddRemove不會是一個原子操作。

相關問題