Parallel.For - pomoc w ogarnięciu

0

witam
Chciałbym wykonywać kilka zadań jednocześnie w osobnych wątkach, z limitem np 5 jednocześnie. Wyczytałem, że dobrym rozwiązaniem będzie użycie Parallel.For. Zrobiłem taki przykład z pomocą googla:

        private delegate void ChangeTextDelegate(string text);
        private static readonly object Sync = new object();
        private void ParallelTest()
        {
            Random r = new Random();
            Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 5 }, delegate (int i)
            {
                this.Cos(i, r.Next(100).ToString());                
            });
        }

        private void ChangeText(string strText)
        {
            this.richTextBox1.Text += strText + "\n";
        }
        
        private void Cos(int i, string n)
        {
            lock (Sync)
            {
                this.Invoke(new ChangeTextDelegate(ChangeText), new object[] { "iteracja: " + i.ToString() + ", wątek: " + Thread.CurrentThread.ManagedThreadId });
            }
}

dlaczego program po chwili zamarza? Jak najlepiej równolegle wykonywać obliczenia w osobnych wątkach?

0

Nie no, jak już chcesz coś wykonać równocześnie to nie blokuj tego.

0

gdzieś wyczytałem, żeby dać locka.

Bez locka (z lock też):

            Parallel.For(0, 100, new ParallelOptions { MaxDegreeOfParallelism = 5 }, delegate (int i)
            {
                this.Cos(i, r.Next(100).ToString());                
            });

cały program się blokuję. Przy 10 jest ok.

1

Bo samo Parallel.For jest blokujące, tj. w tym wypadku czeka na zakończenie wszystkich "iteracji". Wrzuć wywołanie tego np. w lambdę do Task.Factory.StartNew.

gdzieś wyczytałem, żeby dać locka.

No tak z wielowątkowością daleko nie zajdziesz. Jest to na tyle nietrywialny temat, że polecam najpierw przeczytać o tym coś więcej.

0

Dzięki. Tak chyba działa dobrze:

            System.Threading.Tasks.Task.Factory.StartNew( () => Parallel.For(0, 50, new ParallelOptions { MaxDegreeOfParallelism = 5 }, delegate (int i)
            {
                this.Cos(i, r.Next(100).ToString());                
            }));

Polecisz może jakiś dobry artykuł? (oczywiście mogę sobie znaleźć, ale jak ktoś jest obeznany, to wie co poleca)

1 użytkowników online, w tym zalogowanych: 0, gości: 1