2010-12-14 78 views
1

Donc, à Im essayant de faire un système CMS qui utilise le SDK yahoo messenger. L'idée est d'avoir un robot d'auto-assistance capable de guider les clients à travers certains problèmes. La conversation est exécutée par deux méthodes. Un script existe pour répondre avec une réponse générique. Dans chaque message reçu par le client, le programme recherchera des mots-clés et des questions certan qui déclencheront une réponse à partir d'un fichier XML. S'il en trouve un, il continue avec le script. Le programme fonctionne mais a un coût. C'est un énorme porc de ressources. Dans le programme, j'ai une classe qui gère toutes les fonctions de messagerie yahoo comme connexion, déconnexion, recevoir et envoyer des messages. J'ai aussi une classe que j'appelle des conversations. Cela permet de savoir où le message est arrivé, à qui il s'adressait et dans quelle position il se trouvait dans la conversation scriptée. Dans mon programme principal, j'initise X quantité de la classe client en fonction du nombre de sites différents qui aident les comptes que j'utilise. Chaque fois qu'il reçoit un message, il crée une nouvelle classe de conversation car il existe ou il vérifie la conversation existante et trouve la position sripted. Il fait évidemment tous les contrôles pour les mots-clés sur le message entrant aussi bien. C'est mon code pour le gestionnaire d'événements partagés pour recevoir des messages. Ma question est la suivante: y a-t-il un moyen de rendre cela plus efficace?Ressources et efficacité

Private Sub yahooclients_OnRec(ByVal sender As Object, ByVal buddy As String, ByVal message As String) 
    TotalRec = TotalRec + 1 

    Try 


     Dim c As YahooClient = CType(sender, YahooClient) 'Yahoo Client To Send Message From 
     showLog("From:" & buddy & " To:" & c.Account & " Message:" & message) 
     Dim msgSplit As String() 
     Dim retmsg As String 
     Dim smsg As String() 
     Dim n1 As XmlNode 
     Dim sran As New Random 'Random SPlit Message 
     Dim domran As New Random 'Random Domain ID 
     Dim Found1 As Boolean = False 
     Dim FoundIt As Integer = 0 
     Dim i As Integer = 0 'Keyword Counter 
     'Check Message For KeyWords By Splitting Each phrase by spaces 
     msgSplit = Split(message, " ") 
     For Each word In msgSplit 
      For Each value In KeywordInd 
       If value = word Then 
        n1 = m_nodelist.Item(i) 
        retmsg = n1.InnerText 
        GoTo ScrubMessage 
       End If 
       i = i + 1 
      Next 
      i = 0 
     Next 

     'Check For Conversations 
     If convos.Count = 0 Then 
      convos.Add(New Conversation(c.Account, buddy, 0)) 
      retmsg = Script(0) 
      GoTo ScrubMessage 
     Else 
      For A As Integer = 0 To (convos.Count - 1) 
       If InStr(convos(A).TUser, c.Account) > 0 And InStr(convos(A).FUser, buddy) > 0 Then 
        Found1 = True 
        Exit For 
       End If 
       FoundIt = FoundIt + 1 
      Next 
      If Found1 = True Then 
       convos(FoundIt).SPosition = convos(FoundIt).SPosition + 1 
       'Send Next Position In Script 
       If convos(FoundIt).SPosition > (Script.Length - 1) Then 
        If convos(FoundIt).SPosition = Script.Length Then 
         TotalScript = TotalScript + 1 
         ToolStripStatusLabel10.Text = TotalScript 
        End If 
        Exit Sub 
       End If 
       retmsg = Script(convos(FoundIt).SPosition) 
       GoTo ScrubMessage 
      Else 
       convos.Add(New Conversation(c.Account, buddy, 0)) 
       retmsg = Script(0) 
       GoTo ScrubMessage 
      End If 
     End If 

ScrubMessage: « dépouilleront | SMSG = de Split (retmsg, "|")

 'Pull A Random Response 
     If smsg.Length > 1 Then 
      retmsg = smsg(sran.Next(0, (smsg.Length) - 1)) 
     Else 
      retmsg = smsg(0) 
     End If 


     'Check For Domain Indicator 
     If InStr(retmsg, "%") > 0 Then 
      TotalLink = TotalLink + 1 
     End If 
     retmsg = Replace(retmsg, "%s", Domains(domran.Next(0, (Domains.Length - 1)))) 

     If CheckBox2.Checked = True Then 'send Message With Font and Color 
      retmsg = "<font face=" & """" & fname & """" & ">" & "[#FF80C0m" & retmsg & "</font>" 
     End If 


     showLog(("Sending Message: " & retmsg & " To: " & buddy & " From: " & c.Account)) 
     c.SendMessage(buddy, retmsg) 
     TotalSent = TotalSent + 1 
     ToolStripStatusLabel4.Text = TotalSent 'Updates Sent Counter 
     ToolStripStatusLabel6.Text = TotalRec 'Updates Rec Counter 
     ToolStripStatusLabel8.Text = TotalLink 'Updates Links counter 

    Catch ex As Exception 
     showLog(ex.ToString) 
    End Try 

End Sub 

Le programme devient vraiment pas resonsive avec beaucoup de comptes sont poser des questions, etc.

Répondre

0

Il y a peu de choses qui ressemblent à un bon endroit pour commencer.

1) Tirez le code après ScrubMessage dans sa propre fonction qui prend les informations nécessaires en tant que paramètres. Ensuite, remplacez tous les GoTos par des appels. Cela n'améliorera probablement pas les performances, mais rend le code plus facile à comprendre pour la plupart des gens (et la convention dit que les gotos bruts sont mauvais). 2) Vous recherchez dans une liste pour chaque mot de chaque message entrant. Sur la base de l'utilisation, KeywordInd et m_nodelist sont probablement déclarés quelque chose comme ceci:

Dim KeywordInd As List(Of String) 
Dim m_nodelist As List(Of XmlNode) 'or whatever type has the inner text 

Depuis la liste de mots clés semble être une clé dans la liste des nœuds de valeurs, je suggère d'utiliser un dictionnaire pour simplifier le code et potentiellement améliorer la vitesse.

Dim wordResponse As New Dictionary(Of String, String) 

où les clés sont les mots de KeywordInd et les valeurs sont les InnerText de m_nodelist qui vous permet de dire

For Each word In msgSplit 
    If wordResponse.ContainsKey(word) Then 
     ScrubMessage(wordResponse(word)) 
     Exit Sub 
    End If 
Next 

3) Essayez d'associer la conversation directement avec l'objet YahooClient de sorte que vous n'avez pas faire la recherche à chaque fois pour trouver la conversation. Lorsque vous faites cela, vous pouvez également vous assurer qu'il y a un Conversation associé à chaque client si vous le souhaitez.

4) Vous interagissez directement avec ce qui semble être des composants d'interface utilisateur dans le gestionnaire. Cela nécessite que tous les gestionnaires pour tous les clients s'exécutent sur le thread d'interface utilisateur. Vous seriez probablement mieux de lever certains événements de ce gestionnaire et de laisser le formulaire gérer les événements et les publier sur le thread d'interface utilisateur si nécessaire. Les événements seraient probablement ScriptPositionAdvanced et ResponseSent ou quelque chose de similaire.Le formulaire/contrôle pourrait ensuite gérer ces événements et publier sur le thread d'interface utilisateur en fonction du modèle utilisé par votre cadre UI de choix, que vous devriez être en mesure de trouver avec une recherche rapide.

+0

Merci beaucoup pour les conseils !! –