سؤال

أظن أن هذا سؤال غبي للغاية:ما هو بناء الجملة الصحيح لبيان القفل القابل للمقاطعة في C#؟على سبيل المثالالحصول على القفل؛إذا تمت مقاطعة القفل قبل انتهاء التعليمات البرمجية المقفلة، فسيتم إرجاع خطأ من الطريقة المرفقة.ربما المصطلح خاطئ تماما..شكرًا.

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

المحلول

ويمكن أن يكون لديك مهلة بينما <م> حيازته قفل باستخدام Monitor.TryEnter. وبالمثل، داخل القفل الذي يمكن أن تفعل أشياء مثل Monitor.Wait / Monitor.Pulse لانتاج مؤقتا القفل، ولكن لا يمكنك أن توقف على هذا النحو.

والساعة المقاطعة الرئيسية تنطبق قد يكون في Thread.Sleep، والتي يمكن أن تنقطع مع Thread.Interrupt - ولكن مرة أخرى، وهذا لن نثر السيطرة من كتلة طريقة تنفيذ

.

ما هو بالضبط الذي تحاول تحقيقه؟ مع مزيد من السياق يمكننا ربما تساعد أكثر ...

نصائح أخرى

ما تقصده بـ "المقاطعة" غير واضح.

المقاطعة بالاستثناء

private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    try
    {
       lock(foo)
       {
          while(something)
          {
             // Do stuff

             Thread.Sleep(1); // Possibly yield to another 
                              // thread calling Thread.Interrupt
          }
       }

       return true;
    }
    catch(ThreadInterruptedException ex)
    {
       // Handle exception
    }

    return false;
}

إذا return true لم يتم الوصول إليه، فحدث شيء ما أثناء تشغيل القفل foo تم تعليقه، وإرجاع الكود false.يتم تحرير القفل تلقائيًا في كلتا الحالتين.

يمكن لخيط آخر أن يقاطع هذا الخيط عن طريق الاتصال Thread.Interrupt.

"الانقطاع" من التعليمات البرمجية

إذا كنت أنت الشخص الذي "يقاطع" الكود، فقد يكون الأمر بهذه البساطة

private bool SomeLockingMethod(object foo)
{
    // Verify foo is valid

    lock(foo)
    {
       // Do stuff

       if(shouldInterrupt)
       {
          return false;
       }

       // Do more stuff
    }

    return true;
 }

مرة أخرى، يتم تحرير القفل تلقائيًا، سواء كان هناك "انقطاع" أم لا.

انقطاع بسبب محاولة شخص آخر الحصول على القفل

ربما هذا هو ما تبحث عنه؛في هذه الحالة قد ترغب في استخدام شيء آخر، مثل Semaphore أو ManualResetEvent.

ولست متأكدا ما كنت تحاول الحصول على هنا. والغرض من هذا البيان lock هو أنه لا ينبغي الحصول على توقف حتى تتمكن من ضمان سلوك متناسقة.

ما أنت تحاول إنجاز هنا؟

وأضاف

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

انظر هنا لمزيد من التفاصيل.

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