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?
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:
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
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.
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()
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.
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.
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
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
}
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