2008-11-29 30 views
10

Hashtables có thuộc tính đồng bộ hóa nhưng từ điển chung chung thì không. Nếu tôi có mã thực hiện điều này:Hashtable to Dictionary <> syncroot.

lock (hashtable.Syncroot) 
{ 
.... 
} 

Làm cách nào để sao chép điều này nếu tôi xóa bỏ từ khóa bắt buộc và chuyển sang từ điển chung?

Trả lời

10

Nếu bạn đang tuân thủ nghiêm ngặt khả năng tương thích thì Bryan là chính xác. Đây là cách tốt nhất để duy trì ngữ nghĩa hiện tại của bạn trên một từ điển.

Mở rộng trên đó. Lý do thuộc tính SyncRoot không được thêm trực tiếp vào từ điển chung là nó là một cách nguy hiểm để thực hiện đồng bộ hóa. Nó chỉ tốt hơn là "khóa (điều này)" rất nguy hiểm và dễ bị deadlocks. Dưới đây là một vài liên kết nói đến lý do tại sao điều này là xấu.

+0

tức là, đừng làm điều này. – Will

+5

Hoàn toàn đồng ý. Tuy nhiên, tôi thực sự ghét nó khi mọi người trả lời với "điều này là xấu, đừng làm điều đó" :). Hầu hết mọi người hỏi một câu hỏi họ thường bị mắc kẹt trong một kịch bản cụ thể và cần phải làm việc thông qua nó. Tôi cố gắng giúp đỡ về vấn đề và lời khuyên về lý do tại sao nó xấu và cách tránh nó. – JaredPar

5
var dictionary = new Dictionary<int, string>(); 

lock(((ICollection) dictionary).SyncRoot) 
{ 
    // ... 
} 
3

Nếu hashtable/dictionary không công khai, bạn chỉ có thể khóa chính đối tượng từ điển.

7

Tư duy mới đằng sau SyncRoot là nó là một sai lầm trong thiết kế ban đầu. Nếu điều duy nhất để khóa là từ điển và nó là riêng tư, bạn có thể khóa nó hoặc một đối tượng khác đóng vai trò là đối tượng đồng bộ hóa. Kỹ thuật thứ hai rất hữu ích khi trạng thái bạn đang bảo vệ không chỉ là từ điển.

// used as you would have used SyncRoot before 
object _syncLock = new object(); 
Dictionary<string, int> numberMapper = new Dictionary<string, int>(); 

// in some method... 
lock (_syncLock) 
{ 
    // use the dictionary here. 
} 
+0

Bạn có trích dẫn nguồn trên rằng đó là một sai lầm trong thiết kế ban đầu? – dalle

+1

Brad Abrams và Krzysztof Cwalina (người quản lý chương trình .NET) nói như vậy: http://blogs.msdn.com/brada/archive/2003/09/28/50391.aspx – netadictos

+0

Jeffrey Richter cũng trình bày lỗi này trong thiết kế trong CLR Qua C#. – Will

Các vấn đề liên quan