سؤال

تحتوي جداول التصنيف على خاصية syncroot لكن القواميس العامة لا تمتلكها.إذا كان لدي رمز يفعل هذا:

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

كيف يمكنني تكرار ذلك إذا كنت أقوم بإزالة جدول التجزئة والتغيير إلى القواميس العامة؟

هل كانت مفيدة؟

المحلول

إذا كنت تتجه نحو التوافق بشكل صارم، فإن برايان على حق.هذه هي أفضل طريقة للحفاظ على دلالاتك الحالية أعلى القاموس.

التوسع في ذلك بالرغم من ذلك.السبب وراء عدم إضافة خاصية SyncRoot مباشرة إلى القاموس العام هو أنها طريقة خطيرة لإجراء المزامنة.إنه أفضل قليلاً من "القفل (هذا)" وهو أمر خطير للغاية وعرضة للطرق المسدودة.فيما يلي بعض الروابط التي تتحدث عن سبب سوء ذلك.

نصائح أخرى

والتفكير الجديد وراء SyncRoot هو أنه كان خطأ في التصميم الأصلي. إذا كان الشيء الوحيد الذي قفل هو القاموس وانها خاصة، يمكنك قفله أو كائن آخر الذي يعتبر كائن مزامنة. هذه التقنية الأخيرة هي مفيدة عندما تكون الدولة تقوم بحماية هي أكثر من مجرد القاموس.

// 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.
}
var dictionary = new Dictionary<int, string>();

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

وإذا كان جدول هاش / القاموس ليس العام، هل يمكن أن مجرد قفل الكائن القاموس نفسه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top