Hej, mam pewien problem, który nie za bardzo wiem jak mam rozwiązać.Prosiłbym o rady i sugestie, problem tyczy się zadania na uczelnie. Mianowicie mój program rzuca wyjątkiem. Komunikat jaki wyświetla i wiadomość jaką przechwyciłem to "length cannot be less than zero. (Parameter 'length')". Chodzi z tego co rozumiem o substring() w jednej z metod. Z moich rozkmin, metoda problematyczna:
private static string checkIsThisStringOkay( string theLongestRepreatedPrefix, string currentWord, string text)
{
string temp = text.Substring(0, text.IndexOf(currentWord)) + text.Substring((text.IndexOf(currentWord) + currentWord.Length));
if (temp.Contains(currentWord))
{
return currentWord;
}
else
{
currentWord = currentWord.Substring(0, currentWord.Length - 1);
checkIsThisStringOkay( theLongestRepreatedPrefix, currentWord, text);
return currentWord;
}
}
Problem zaczął się gdy chciałęm przyśpieszyć działanie kodu, dodając Parallel.ForEach. Gdy wszystko leciało sekwencyjnie po kolei każda krawędź, to nie było problemu, żadnych wyjątków i wynik dla testowanego przykładu dobry. Tylko teraz to niestety nie działa. Za trochę dziwne i niezrozumiałe dla mnie uważam, iż jeżeli postawię pułapkę w tym Parallel.Foreachu i puszczę program kilka razy, to raz na 10 nie wywala wyjątku tylko działa i przechodzi. Trochę nie rozumiem... Pewnie to chodzi o równoległą pracę i potrzebę zgłębienia przeze mnie równoległego działania forów/ foreachy. Gdyby ktoś mógł podpowiedzieć, co należy zrobić byłbym wdzięczny bardzo.
Parallel.ForEach(trie._root._edges,
(edge) =>
{
Dictionary<char, Edge<int>> keyValuePairConvertedToDictonary = new Dictionary<char, Edge<int>> { { edge.Key, edge.Value } };
string myLongestWord = "";
TraversePostOrder(keyValuePairConvertedToDictonary, ref myLongestWord, ref temp, args[0]);
myLongestWordEdge.Add(myLongestWord);
}
);
Dzięki za poświęcony mi czas =) bardzo doceniam i pozdrawiam Michał/ Jarver :)
PS. link do gita z całym kodem gdyby ktoś chciał zerknać