সমান্তরাল বিরতি?


111

আমি কীভাবে একটি সমান্তরাল.আর লুপটি ভেঙে ফেলব ?

আমার একটি সুন্দর জটিল বক্তব্য রয়েছে যা নীচের মত দেখাচ্ছে:

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
    new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
    {
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
        {
            Found = true;
            break;
        }
    }));

সমান্তরাল বর্গ ব্যবহার করে, আমি এখন পর্যন্ত এই প্রক্রিয়াটি অনুকূল করতে পারি। যাহোক; আমি বুঝতে পারি না কীভাবে সমান্তরাল লুপটি ভাঙ্গবো? break;বিবৃতি ছোঁড়ার নিম্নলিখিত সিনট্যাক্স ত্রুটি:

কোন এনকোলেসিং লুপ নেই যার মধ্যে ভাঙ্গতে বা চালিয়ে যেতে হবে


1
আপনি কি একই সাথে লুপ ব্রেকের সমস্ত সমান্তরাল দৃষ্টান্তগুলি আশা করতে পারেন?
n8wrl

উত্তর:


185

ParallelLoopState.Breakপদ্ধতিটি ব্যবহার করুন :

 Parallel.ForEach(list,
    (i, state) =>
    {
       state.Break();
    });

বা আপনার ক্ষেত্রে:

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
    new Action<ColorIndexHolder, ParallelLoopState>((ColorIndexHolder Element, ParallelLoopState state) =>
    {
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
        {
            Found = true;
            state.Break();
        }
    }));

ঠিক। আমি এই পোস্ট করতে চলেছি।
মেরে ইনফিনিটাস

1
সিক্যুয়েনাল ফোরচ লুপের কথা চিন্তা করে এটি গ্যারান্টিযুক্ত যে আইটেমের আগে থাকা আইটেমগুলি যে কোনও কারণে ব্রেকের কারণেই প্রক্রিয়াজাত হয়। সমান্তরাল সম্পর্কে কী? প্রত্যেক আইটেমের ক্রমটি যে প্রক্রিয়াজাত হয় সেটির ক্রম হয় না? এটিরও কি গ্যারান্টি আছে যে যে সমস্ত আইটেম একটি আইওনামার্যাল <...> এর আগে যা রাষ্ট্রকে আহ্বান করে তার আগেই।ব্রেক () প্রসেস করা হচ্ছে এবং এরপরে যারা আসছেন তারা কি তা নয়? যদিও পূর্বেরটি কোনওভাবে অর্জন করা যেতে পারে, তবে আমি দেখতে পাচ্ছি না যে পরবর্তীকালে কীভাবে আদৌ সম্ভব হবে।
হেন্ডরিক উইস

4
@ হেন্ডরিক উইস: ডক্স বলছেন: Calling the Break method informs the for operation that iterations after the current one don't have to execute. However, all iterations before the current one will still have to be executed if they haven't already.এবংthere is no guarantee that iterations after the current one will definitely not execute.
টিউডর

2
সুতরাং state.Stop()নির্ভরযোগ্যভাবে প্রত্যাশিত ফলাফলগুলি অর্জন করা আরও উপযুক্ত হবে, নীচে মাইক পেরেনউড এবং এমবিএন্টলে লিখেছেন
xtreampb

44

আপনি এর জমিদার ব্যবহার কল করে এই কাজ করতে Parallel.Forবা Parallel.ForEachযা একটি লুপ রাজ্যের পাস, তারপর কলিং ParallelLoopState.Breakবা ParallelLoopState.Stop। মূল পার্থক্যটি কীভাবে জিনিসগুলি খুব দ্রুত ভেঙে যায় - তার সাথে Break()লুপটি সমস্ত আইটেমকে বর্তমানের তুলনায় আগের "সূচক" দিয়ে প্রক্রিয়া করবে। সহ Stop(), এটি যত তাড়াতাড়ি সম্ভব প্রস্থান করবে।

বিশদগুলির জন্য, কীভাবে: থামুন বা সমান্তরাল থেকে বিরতি দেখুন Lo লুপের জন্য


3
+1, দেখে মনে হচ্ছে আমাদের এখানে কয়েকজনের ঠিক একই উত্তর আছে :) - ওহ এবং আমি সেখানে অন্য মন্তব্যকারী ব্যক্তির উপর আপনার ব্যাক আপ পেয়েছি।
মাইক পেরেনউড

এই ব্যাখ্যার জন্য ধন্যবাদ। আপনি কি জানেন যে কখন ব্রেক বা স্টপ বলা হয়, এটি কি বর্তমানে কার্যকর করা পুনরুক্তিগুলি সম্পন্ন হয় বা মৃত্যুদন্ড কার্যকর করার মধ্য দিয়ে পুনরাবৃত্তিগুলি বন্ধ করে দেয়?
সিজিবি

1
@ সিজিবি বর্তমানে সম্পাদনকারী কার্যক্রম সম্পূর্ণ complete
রিড কোপসি

12

আপনার যা ব্যবহার করা উচিত তা হ'ল Anyফোরচ লুপের চেয়ে:

bool Found = ColorIndex.AsEnumerable().AsParallel()
    .Any(Element => Element.StartIndex <= I 
      && Element.StartIndex + Element.Length >= I);

Any যত তাড়াতাড়ি এটি জানে যে ফলাফল অবশ্যই সত্য হতে পারে থামার জন্য যথেষ্ট স্মার্ট।


10

লুপস্টেট অবশ্যই একটি দুর্দান্ত উত্তর। আমি পূর্বের উত্তরগুলিতে আরও অনেকগুলি স্টাফ পেয়েছি যে উত্তরটি পাওয়া শক্ত ছিল, সুতরাং এখানে একটি সাধারণ ঘটনা রয়েছে:

using System.Threading.Tasks;

Parallel.ForEach(SomeTable.Rows(), (row, loopState) =>
{
    if (row.Value == testValue)
    {
        loopState.Stop();  // Stop the ForEach!
    }       
    // else do some other stuff here.
});

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.