سؤال

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

مقتطف الكود:

foreach (String s in (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings))
    {
        //do some jazz
    }

--يحرر--

أخذت الإجابة ولكني وجدت أيضًا أنني بحاجة للتأكد من أن الكود الذي كان يكتب إلى المجموعة يحتاج إلى محاولة الحصول على قفل أيضًا.

    private void addKillString(String s)
    {
        lock (killStrings)
        {
            killStrings.Add(s);
        }
    }
هل كانت مفيدة؟

المحلول

بخلاف إجراء نسخة عميقة، قد يكون أفضل رهان هو قفل المجموعة:

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }

نصائح أخرى

لذا، لست متأكدًا تمامًا مما تطلبه، ولكن فريق Parallel Extensions قام بتجميع بعض الأشياء التي قد تناسب الفاتورة.راجع منشور المدونة هذا على وجه الخصوص، حول تعداد المجموعات المتوازية.ويحتوي أيضًا على رابط لتنزيل Parallel CTP، ويمكنك بالطبع تصفح بقية منشورات المدونة للحصول على فكرة عما يهدف CTP إلى القيام به وكيفية عمل نموذج البرمجة.

إذا كنت تريد استخدام مجموعات FCL، فإن القفل هو الطريقة الوحيدة لدعم التكرار/التعديل من سلاسل رسائل متعددة قد تتداخل.

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

إذا كنت مهتمًا بإلقاء نظرة على مكتبة مجموعات تابعة لجهات خارجية، فإنني أوصي بالممتاز مكتبة المجموعة العامة C5.لديهم مجموعة من المجموعات الشجرية التي يمكن تعديلها وتكرارها بسهولة وأمان في نفس الوقت دون قفل - راجع القسمين 8.10 و9.11 من وثائقهم (الممتازة) للحصول على التفاصيل.

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