Avatar billede Thomas_E Nybegynder
17. juni 2011 - 13:57 Der er 9 kommentarer og
2 løsninger

problem med multithreading

Hej Eksperter,

Jeg bruger HtmlAgilityPack HTML parser og det virker fint men for at det hele skal gå nået hurtiger har jeg prøvet at bruge multithreading men den fejler en en eller anden grund? Her er min kode:


string TheReturn = "";
Parallel.ForEach(doc.DocumentNode.SelectNodes("//a[@href]"), Links =>{
HtmlAttribute href = Links.Attributes["href"];
if (href.Value.IndexOf("https://") != -1)
                                    {
                                        TheReturn += "Https page";
                                    }
                                    else
                                    {
                                        TheReturn += "Http page";
                                    }
});

return TheReturn;

af en eller anden grund er return tom selv om at doc.DocumentNode.SelectNodes("//a[@href]").length er 82 ?

og det virker fint hvis jeg ikke bruger parallel.ForEach men istedet bruger en simple foreach (HtmlNode Links in doc.DocumentNode.SelectNodes("//a[@href]")), så bliver resultatet af alle 82 elementer retuneret? Er der nogle der kan se hvor fejlen er?
Avatar billede Syska Mester
17. juni 2011 - 14:11 #1
Hej,

Pas ... har ikke rodet så meget med det.

Men hvad sker der hvis du bruger:
System.Collections.Concurrent.ConcurrentBag<string> list = new ConcurrentBag<string>();

Og smider din return type ind i den og bagefter samlet den liste til en string.

return string.Join(" ", list.ToArray());

mvh
Avatar billede arne_v Ekspert
18. juni 2011 - 19:53 #2
Koden er ihvertfald ikke korrekt.

TheReturn tilgaaes fra flere traade uden nogen form for synkronisering.

Det vil ofte gaa galt.

Det undrer mig lidt at den ender op som "", men naesten alt kan ske med den slags kode.
Avatar billede Thomas_E Nybegynder
20. juni 2011 - 07:59 #3
Hvordan kan jeg synkroniser retur værdien ?
Avatar billede Syska Mester
20. juni 2011 - 08:17 #4
Har du prøvet det jeg har skrevet?
Avatar billede arne_v Ekspert
20. juni 2011 - 14:38 #5
string TheReturn = "";
object mylck = new object();
...
lock(mylck)
{
    TheReturn += "Https page";
}
...
lock(mylck)
{
    TheReturn += "Http page";
}
Avatar billede arne_v Ekspert
08. august 2011 - 01:03 #6
Tid at faa afsluttet her?
Avatar billede Thomas_E Nybegynder
03. november 2011 - 09:46 #7
smid et svar!
Avatar billede Syska Mester
03. november 2011 - 15:22 #8
Hvem eller begge ?
Avatar billede Thomas_E Nybegynder
08. november 2011 - 14:30 #9
begge
Avatar billede arne_v Ekspert
08. november 2011 - 14:45 #10
svar
Avatar billede Syska Mester
08. november 2011 - 14:59 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester