2010-02-04 6 views
0

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) 
+0

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

+0

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? –

+0

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

Répondre

1

Au lieu d'utiliser un ArrayList, je voudrais utiliser un Synchronized Queue. Chaque thread de lecture peut être mis en file d'attente pendant que chaque thread d'écriture peut être en file d'attente.

+0

Merci, je vais essayer ça. – vbNewbie

+0

Question rapide, utilise la synchronisation du tout efficace, puisque j'ai trouvé que même en l'utilisant il y a toujours un conflit de threads essayant d'y accéder. Alors devrais-je créer une nouvelle file d'attente à chaque fonction où j'ai besoin d'un accès aux fichiers? – vbNewbie

+0

Tout le monde devrait accéder à la même file d'attente, je pense: Processus 1: instancier la file d'attente, faire tourner les robots d'exploration et les processeurs. Processus 2 - n: exploration, acquisition de contenu, traitement, mise en file d'attente. Processus n + 1: vérification de la file d'attente, mise en file d'attente, sauvegarde. –

Questions connexes