Równolegle.Foreach Debug lub Step Through

Czy jest łatwy sposób na przejście przez równoległość.foreach? Jaki jest najlepszy sposób na debugowanie tego za pomocą punktu przerwania?

Author: HackedByChinese, 2012-06-20

7 answers

Możesz uzyskać podobne wyniki w Visual Studio po prostu zamrażając wszystkie wątki z wyjątkiem jednego, zaznaczając wszystkie wątki z wyjątkiem jednego w oknach wątków i klikając prawym przyciskiem myszy - > zamrozić w ten sposób:

Tutaj wpisz opis obrazka

Ponadto, jeśli chcesz odtworzyć stan wyścigu i zatrzymać się na punktach przerwania, zawsze możesz dodać tracepoints - za pomocą visual studio lub wtyczek, które w tym pomagają, takich jak oz Code

Tutaj wpisz opis obrazka

 4
Author: Stas Sh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 17:12:14

Podczas debugowania często konfiguruję mój Parallel.ForEach, aby działał z MaxDegreeOfParallelism ustawionym na 1. To znacznie ułatwia debugowanie.

const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item => 
{ //...

Jednak nie pomoże to w debugowaniu problemów związanych z warunkami wyścigu lub synchronizacją danych, a w rzeczywistości często ukryje lub wyeliminuje prawdziwe problemy w kodzie.

Te problemy można często debugować znacznie łatwiej przy użyciu nowych narzędzi W VS 2010, takich jak Parallel Tasks window, lub przy użyciu różnych technik wymienionych w debugowanie aplikacji wielowątkowych, takich jak przełączanie wątków, blokowanie wątków podczas kroczenia itp.

 28
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-19 20:41:33

Podobnie jak inne odpowiedzi tutaj, ustawiamy stopień równoległości na 1 podczas debugowania, ale robimy to za pomocą metody rozszerzenia, takiej jak:

public static ParallelQuery<TSource> AsDebugFriendlyParallel<TSource>(this IEnumerable<TSource> source)
{
    var pQuery = source.AsParallel();
    #if DEBUG
    pQuery = pQuery.WithDegreeOfParallelism(1);
    #endif

    return pQuery;
}

Następnie zamiast używać .AsParallel() używamy .AsDebugFriendlyParallel()

 7
Author: PaulG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-27 10:42:00

Przepisz go tymczasowo jako nie-równoległy foreach lub użyj dyrektyw preprocesora do wykonania kodu nie-równoległego podczas uruchamiania w trybie debugowania.

 0
Author: Bob Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-19 20:38:58

Lubię używać opcji " When Hit "na punkcie przerwania (kliknij prawym przyciskiem myszy punkt przerwania, wybierz" When Hit...". Możesz wydrukować wiadomość do konsoli, która zawiera wartości zmiennych, wątek, w którym się znajdujesz, itp.

 0
Author: Kevin Aenmey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-19 20:46:35

OzCode bardzo ci pomoże, ma funkcję taką jak tracepoints na sterydach, która jest bardzo przydatna podczas debugowania współbieżnego\równoległego kodu https://www.youtube.com/watch?v=_vuMi-3jGwY

 0
Author: Tamir Dresher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 16:51:24

Jak odpowiedział @ PaulG myślę, że najlepszą praktyką jest po prostu ustawić MaxDegreeOfParallelism wartość 1. Wtedy normalnie Parallel będzie działać podobnie do zwykłej pętli jak For, Foreach. Jest to szybszy sposób debugowania Parallel. Nie musisz więc przełączać kodu pomiędzy zwykłą pętlą i Parallel.

Parallel.For(0, itemsList.Count, new ParallelOptions { MaxDegreeOfParallelism = 1 }, i =>
{
    //your process goes here
}
 0
Author: Liakat Hossain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 09:40:18