سؤال

أنا مبرمج جافا وأنا أعرف بعض الأشياء عن خيوط الباحث جافا.

في جافا يمكنني قفل طريقة باستخدام مزامنة الكلمة:

private int a;
private int b;
private int c;
private synchronized void changeVars()
{
  a = 4;
  b = 2;
  c = a+b;
}

بحثت في msdn و رأيت أن هناك عدد قليل من الألعاب في c# للعب مع المواضيع.مثل مراقبة.أدخل, مراقبة.مخرج قفل أو متقدم أحد مزامنة.

ولكن ما أريد هو لمزامنة أسلوب واحد.ما يعادل ذلك في c# ؟

شكرا مقدما.

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

المحلول

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

using System.Runtime.CompilerServices;

...

private int a;
private int b;
private int c;

[MethodImpl(MethodImplOptions.Synchronized)]
private void changeVars()
{
  a = 4;
  b = 2;
  c = a+b;
}

نصائح أخرى

وليس هناك ما يعادل المباشر في C #، ولكن يمكنك أن تفعل الشيء نفسه مع هذا:

private readonly object changeVarsLockObject = new object();

private void changeVars()
{
  lock(changeVarsLockObject)
  {
    a = 4;
    b = 2;
    c = a+b;
  }
}

ومجرد أن تكون واضحة - يعلن طريقة متزامنة في جاوة يتطلب أن المتصل يحمل الشاشة على الكائن الذي كان يسمى الأسلوب على (والذي هو كائن Class لأساليب ثابتة)

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

<القوي> التزامن من الصعب و من الناحية المثالية تحتاج إلى معرفة المزيد من "عدد قليل من الأشياء" عن أنه إذا كنت ترغب في تجنب المآزق والقضايا الرؤية التي تكاد لا تظهر أثناء الاختبار، أو تؤدي إلى التصحيح . أخذ فهم ربما ناقصة التزامن في لغة واحدة، ومحاولة لنقل أكثر من لغة أخرى مع الأوليات مختلفة وعلى الأرجح نموذجا ذاكرة مختلفة هو وصفة لكارثة.

وهكذا في حين أن هذا ليس هو الحل أونيلينير كنت تبحث عنه، وانا ذاهب لتأكيد أن أي إجابة أونيلينير محكوم عليها بالفشل دون علم النظام البيئي بأكمله التي تعضد هذا الامر. وهكذا يجب على قراءة كتاب جيد / تعليمي في تزامن في C #، بدلا من محاولة ترجمة بك جافا تجربة الكلمة عن طريق الكلمات الرئيسية.

أي ما يعادل مباشرة من يستخدم قفل (هذا):

private void ChangeVars()
{
    lock (this) {
        a = 4;
        b = 2;
        c = a+b;
    }
}

أو في الواقع باستخدام MethodImplAttribute كما وصفها R.Bemrose ، والذي يصل إلى نفس الشيء:

[MethodImpl(MethodImplOptions.Synchronized)]
private void ChangeVars()
{
    a = 4;
    b = 2;
    c = a+b;
}

...ومع ذلك ، فمن غير المستحسن استخدام علنا كائن مرئي عن تأمين ، حيث شخص آخر قد ترغب في استخدامه بمثابة قفل كائن كذلك, حتى أفضل ترجمة:

private object monitor = new object();
private void ChangeVars()
{
    lock (monitor) {
        a = 4;
        b = 2;
        c = a+b;
    }
}

والحل المفضل هو التفاف الجسم الأسلوب في بيان lock.

internal class Foo
{
   private Object lockObject = new Object();

   private void ChangeVars()
   {
      lock (this.lockObject)
      {
         // Manipulate the state.
      }
   }
}

ويمكنك استخدام تزامن التعريفي أيضا، ولكن هذا له العيب الواضح أن عليك أن تستمد من <لأ href = "http://msdn.microsoft.com/en-us/library/system.contextboundobject.aspx" يختلط = "نوفولو noreferrer"> ContextBoundObject و جميع طرق مزينة في Synchronization تشترك في نفس الكائن قفل الحد من تحبب القفل.

internal class Foo : ContextBoundObject
{
   [Synchronization]
   private void ChangeVars()
   {
      // Manipulate the state.
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top