سؤال

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

قانون بلدي هو شيء من هذا القبيل:

internal partial class SynchronizationForm : Form
{
    private static volatile bool workInProgress;

    private void SynchronizationForm_Shown(object sender, EventArgs e)
    {
        lock (typeof(SynchronizationForm))
        {
            if (!workInProgress)
            {
                workInProgress = true;
            }
            else
            {
                this.Close();
            }
        }
    }
}

هذا يعمل بشكل جيد ولكن عند تشغيل التعليمات البرمجية التحليل على مشروعي أنا على الحصول على رسالة التحذير التالية:

CA2002 :مايكروسوفت.الموثوقية :'SynchronizationForm.SynchronizationForm_Shown(كائن, EventArgs)' أقفال على إشارة من نوع 'نوع'.استبدل هذا القفل ضد كائن قوي مع الهوية.

يمكن لأي شخص أن يشرح لي ما هو الخطأ في قانون بلدي و كيف يمكن تحسين ذلك لجعل التحذير من ذهب.ماذا يعني ذلك الكائن القوي الهوية ؟

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

المحلول

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

private static object _syncRoot = new object();
...
lock (_syncRoot) 
{

}

وهذا يضمن لك انه الوحيد SynchronizationForm التي يمكن أن تمتلك القفل.

نصائح أخرى

من MSDN شرح القاعدة

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

لأنك لا يمكن أن تتوقع بالضرورة ما أقفال AppDomain آخر قد تتخذ ، و منذ تلك الأقفال قد تحتاج إلى تعبئتها ثم تكون مكلفة ، هذه القاعدة من المنطقي بالنسبة لي.

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

var form = new SynchronizationForm();
lock(typeof(SynchronizationForm))
{
    form.SomeMethodThatCausesSynchronizationForm_ShownToBeCalled();
}

وبعد ذلك الجمود سيحدث. وبدلا من ذلك يجب أن delcare كائن القفل الخاص في فئة SynchronizationForm وقفل على ذلك بدلا من ذلك.

<اقتباس فقرة>   

والكائن System.Type من فئة يمكن بسهولة أن تستخدم لقفل الإقصاء المتبادل لأساليب ثابتة للفئة.

المصدر: http://msdn.microsoft. كوم / EN-US / مكتبة / aa664735 (VS.71) .aspx اتصال

لإضافة إلى الإجابة دوغ، ما لديك هنا هو آلية تأمين التي يجب استخدامها فقط في أساليب ثابتة، وتستخدم في أسلوب مثيل.

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