إذا قمت بتحديث dataRow ، فهل أقوم بإغلاق DataTable أو DataRow بالكامل؟

StackOverflow https://stackoverflow.com/questions/2607661

سؤال

لنفترض أنني أصل إلى ملف DataTable من خيوط متعددة. إذا كنت أرغب في الوصول إلى صف معين ، أظن أنني بحاجة إلى قفل هذه العملية (قد أكون مخطئًا في هذا الأمر ، لكنني على الأقل أعرف بهذه الطريقة آمنة):

// this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
    row = orderTable.FindByOrderId(myOrderId);
}

ولكن بعد ذلك ، إذا أردت ذلك تحديث هذا الصف ، هل يجب أن أقفل الجدول (أو بالأحرى ، الجدول Rows.SyncRoot هدف) تكرارا, ، أو هل يمكنني ببساطة قفل الصف؟

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

المحلول

في الواقع ، مجرد أداء أ lock في مكان واحد على DataTable أو DataRow ليس في الواقع فعل اى شى. جانب مهم يجب تذكره في استخدام Monitor الأقفال (وهو ما أ lock كتلة) هو أن قفل كائن لا يفعل أي شيء له ؛ هذا هو أحد الأسباب التي تجعل بعض المدافعين عن استخدام كائنات قفل مخصصة بدلاً من قفل المورد نفسه ، لأنه يجبرك على إدراك أنه يتعين عليك تنفيذ القفل (وعلى نفس الكائن) كلما تعاملت مع المورد.

ومع ذلك ، من الأفضل قفل كامل DataTable, ، نظرًا لوجود تخزين البيانات نفسه ( DataRow الكائنات داخليًا تحتوي فقط على إزاحة في DataTable فيما يتعلق بمكان استرداد البيانات). لهذا السبب ، حتى لو قمت بمزامنة الوصول إلى الصفوف الفردية ، قم بتحديث اثنين مختلف سوف تسبب لك الصفوف في وقت واحد تحديث نفس آلية تخزين البيانات بطريقة غير متزامنة.

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

النتيجة هي أنه ، يجب عليك قفل كامل DataTable لتجنب تحديث نظام تخزين البيانات الداخلي بطريقة غير متزامنة.

نصائح أخرى

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

Datatable آمن فقط لعمليات القراءة متعددة الخيوط:

http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

http://social.msdn.microsoft.com/forums/en-us/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

عند القراءة حول DataTable ، هناك معلومات متضاربة تتعلق بالقدرة على قفل الجدول والسماح لك بتحديث البيانات بأمان في صف واحد. وفقًا للرابط الثاني ، يمكنك قفل الجدول وتحديث الصف. نظرًا لأن هذا هو من MS MVP ، أود أن أقول أنه ربما يمكنك قفل الجدول وأن تكون على ما يرام.

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