2010-10-20 8 views
0

Je dois créer un programme qui me permettra de suivre à partir d'un système différents points de déclenchement touchés.Considérations relatives à la conception WPF à l'aide du contrôle WebBrowser

Lorsqu'un déclencheur a été atteint au sein d'un autre système d'un service Web est appelé, ce service Web se connectera à une base de données suivantes:

  1. affilié Id
  2. Id Trigger
  3. Code de référence

Mon programme est de lire ces données et de lancer un appel aux sites affiliés pour le suivi des affiliés. Le seul problème, c'est que ces sites n'offrent pas de service web ou de formulaire de message, il est fait via des pixels de suivi (images créées à partir d'une sorte de processus sur leur serveur) ou javascript.

J'ai donc essayé de le faire fonctionner, et la seule façon de le faire est d'utiliser une application WPF ou WinForms en utilisant le contrôle "WebBrowser".

Je reçois simplement l'ensemble des résultats de la base de données et pour chaque déclencheur capturé obtenir le code d'image suivi d'affiliation requise ou code javascript puis effectuer un remplacement sur les touches prédéfinies avec les numéros de référence, ids d'affiliation, etc.

Ma préoccupation ici est que le contrôle WebBrowser est asynchrone. Il se peut qu'il ne traite pas la demande javascript ou image avant que je demande au navigateur Web de charger un autre extrait de code de suivi.

List<TRACKING_TRANSACTIONS> trackingTransactions = affiliateContext.TRACKING_TRANSACTIONS.Where(at => at.EFFECTIVE_DATE <= DateTime.Now && at.PROCESSED_DATE == null).ToList(); 

foreach (TRACKING_TRANSACTIONS transaction in trackingTransactions) 
{ 

    if (transaction != null) 
    { 
     AFFILIATE_TRIGGERS affiliateTrigger = affiliateContext.AFFILIATE_TRIGGERS.SingleOrDefault(at => at.AFFILIATE_ID == transaction.AFFILIATE_ID && at.TRIGGER_ID == transaction.TRIGGER_ID); 

     if (affiliateTrigger != null) 
     { 
      //do replacements 
      string trackingCode = ReplaceStringValues(affiliateTrigger.TRACKING_CODE, transaction); 

      RunWebBrowserTrackingCode(trackingCode);//ConfigurationManager.AppSettings["WebsiteUrl"] + "?trackingTransactionId=" + transaction.TRACKING_TRANSACTION_ID.ToString());   
      Thread.Sleep(2000); 

      transaction.PROCESSED_DATE = DateTime.Now; 

      affiliateContext.SaveChanges(); 
     } 
    } 


} 

Les appels vers le navigateur web sont ici

void RunWebBrowserTrackingCode(string trackingCode) 
{ 

    if (!webBrowser.Dispatcher.CheckAccess()) 
    { 
     webBrowser.Dispatcher.Invoke(
     System.Windows.Threading.DispatcherPriority.Normal, 
      new Action(
      delegate() 
      { 
       webBrowser.NavigateToString(trackingCode); 
      } 
     )); 
    } 
    else 
    { 
     webBrowser.NavigateToString(trackingCode); 
    } 
} 

Ma principale préoccupation est que l'utilisation Thread.Sleep(2000); et rendre le programme juste attendre est la mauvaise façon de le faire.

Quelqu'un peut-il suggérer un meilleur moyen? Ai-je même abordé cela en utilisant les bonnes technologies ici?

Répondre

1
+0

Je considère que, mais ne pouvait pas travailler comment j'itterate dans ma liste à l'aide de cette attendre qu'elle se termine. Sauf si j'ai une sorte de variable qui dit que c'est correct de traiter l'objet suivant dans la liste, un peu comme un seau qui fuit? Mais cela me ferait une boucle serrée, while (cannotProcessNextItem) {// s'asseoir et ne rien faire} – jimplode

+0

Devais utiliser un événement différent dans WCF, j'attends maintenant le chargement complet de la page web, puis je traite le suivant. – jimplode