J'ai essayé d'implémenter un crawler multithread et il semble fonctionner dans l'extraction simultanée d'une liste ou d'urls sans aucun problème. J'ai testé chaque étape et le programme a écrit tout le HTML extrait dans un fichier texte. Maintenant, le reste du programme a l'intention de prendre chaque html stocké comme une chaîne et l'analyser pour une liste d'URL de cette page, puis écrire cette liste dans une base de données. C'est ici que les erreurs commencent: J'ai d'abord verrouillé le processus d'analyse car il a d'abord provoqué des erreurs en retournant des listes vides avec l'erreur 'Échec de l'évaluation' Maintenant, j'ai des listes retournées mais je ne peux pas écrire cela dans une base de données.Problèmes de threads dans .net
Ma question est: dois-je tout verrouiller et pourquoi? Est-ce que je ne peux pas autoriser tous les threads à analyser en même temps et écrire chacun à un arraylist? Est-ce que tout cela entrave la performance?
Voici un exemple d'une partie de mon code; d'abord l'appel d'aller analyser une URL:
If Not String.IsNullOrEmpty(html) Then
'get all links first
links = parser.GetLinks(fromUrl, html)
alors d'écrire à une base de données:
For Each link As String In links
recordsAffected = _
Links_DBObj.insert_feedurls_link(link, feedlink, execError, connObj_Generic, commObj_Generic)
Que voulez-vous dire par "* Je ne peux pas écrire ceci dans une base de données *"? Avez-vous un message d'erreur? Si oui, lequel et à quoi ressemble la ligne de code où vous obtenez le message d'erreur? Et que voulez-vous dire par "lock-out"? – Heinzi
Un thread remplit-il "Links" alors qu'un autre thread essaye de lire à partir de "Links" en même temps? Et, vous obtenez une erreur sur la partie de lecture? –
Vos listes de codes n'ont aucune indication de quoi que ce soit de thread ou de verrouillage. S'il vous plaît expliquer ce que ces fils font. Si chaque thread fait tout le code indiqué ci-dessus, alors je suppose que votre implémentation DB n'est pas thread-safe. "connObj_Generic" et "commObj_Generic" sont probablement partagés par tous les threads. C'est probablement votre problème. – CodingWithSpike