سؤال

أريد معالجة شيء ما باستخدام حلقة متوازية مثل هذا :

public void FillLogs(IEnumerable<IComputer> computers)
{
    Parallel.ForEach(computers, cpt=>
    {
        cpt.Logs = cpt.GetRawLogs().ToList();
    });

}

حسنا ، إنه يعمل بشكل جيد.ولكن كيف تفعل إذا كنت تريد طريقة فيللوغس إرجاع إينوميرابل ?

public IEnumerable<IComputer> FillLogs(IEnumerable<IComputer> computers)
{
    Parallel.ForEach(computers, cpt=>
    {
        cpt.Logs = cpt.GetRawLogs().ToList();
        yield return cpt // KO, don't work
    });

}

تحرير

يبدو أنه ليس ممكنا...ولكن يمكنني استخدام شيء من هذا القبيل :

public IEnumerable<IComputer> FillLogs(IEnumerable<IComputer> computers)
{
    return computers.AsParallel().Select(cpt => cpt);
}

ولكن أين أضع cpt.Logs = cpt.GetRawLogs().ToList(); التعليمات

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

المحلول

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

إذا كان المتصل سيستغرق بعض الوقت يستهلك كل واحد ، فقد يكون هناك بعض المزايا لمنهج يعالج سجلًا واحدًا فقط في كل مرة ، ولكن يمكنه فعل ذلك بينما المتصل يستهلك السجل السابق ؛أي أنه يبدأ برمز العلامة العام للعنصر التالي قبل رمز الترميز العام ، وينتظر اكتماله بعد رمز الترميز العام ... ولكن هذا أمر معقد جدًا مرة أخرى.كمثال مبسط: Genacodicetagpre

نصائح أخرى

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

ماذا عن Genacodicetagpre

تعديل: أعتقد أن هذا أفضل: Genacodicetagpre

Edit2: أوافق على الإجابة القصيرة لا .هذا الرمز عديم الفائدة.لا يمكنك كسر حلقة العائد.

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