سؤال

أنا أراجع بعض الكود وواحد من تحذيرات تحليل الكود (FXCOP) قد حصلت على الخلط بينها. الرمز ينفذ عدد قليل mutex.عن طريق إنشاء المتغيرات في بداية الفصل، على غرار هذا:

private Mutex myMutex = new Mutex();

FXCOP ظهرت برسالة تقول إنني يجب أن أقوم بتنفيذ الخالية للفئة لأن فئة Mutex تنفذها - وهذا تحذير CA1001.. وبعد لكن النظر في mutex لا يوجد لديه طريقة التخلص منها.

اتضح أن mutex تستخدم safewithandle. (أي تنص على تخمين - التخمين هذا هو ما يلتقط FXCOP)، لكن MUTEX لا تتخلصه بالفعل عبر النمط القياسي المتاح. لديها طريقة خاصة تم تعيينها للمندوب باستخدام runtimehelpers.cleanupcode., وهذا ما أفهمه يعني أنه سيتم تشغيله على استثناء.

هذا يطرح سؤالين:

  1. هل تم تنفيذ موبيوكس بشكل صحيح؟ إذا لم يكن هناك استثناء في MUTEX، فلن يتم التخلص من SafeWaithandle.
  2. ما الذي يجب علي الاتصال فيه بالتخلص من تنظيف Mutex؟
هل كانت مفيدة؟

المحلول

Mutex تنفذ صراحة IDisposable.Dispose من خلال فئة الأساس WaitHandle. وبعد انه يكشف Dispose وظائف من خلال الجمهور Close الطريقة (الموروثة أيضا من WaitHandle)، وهو تطبيق صالح لنمط التخلص، وفقا للمبادئ التوجيهية:

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

عدة فصول في System.IO تفعل ذلك بهذه الطريقة كذلك.

نصائح أخرى

باستخدام الدالة الإغلاق () لا تزال تولد CA2000. ضمن تحديث VS 2013 Pro 2. وظيفة التخلص () غير قابلة للوصول بسبب مستوى الحماية.

إذن، هل هناك خطأ أو هل هذا خطأ في تحليل التعليمات البرمجية من VS؟

تحرير: حلها باستخدام هذا الرمز:

Mutex MyApplicationMutex = null;
try
{
  MyApplicationMutex = new Mutex(true, Program.g_ApplicationMutexName);
  if (MyApplicationMutex.WaitOne(0, false))
  {
    ...
  }
}
finally
{
  // Dispose Mutex
  if (MyApplicationMutex != null)
    MyApplicationMutex.Close();
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top