2013-03-16 5 views
0

J'écris un service WCF qui a des données source provenant de plusieurs sources. Ce sont de gros fichiers dans divers formats.Utilisation correcte des délégués et multi-threads

J'ai implémenté la mise en cache et mis en place un intervalle d'interrogation afin que ces fichiers soient mis à jour avec de nouvelles données.

J'ai construit une classe de gestionnaire qui est essentiellement chargée de renvoyer les objets XDocument à l'appelant. La classe manager vérifie d'abord l'existence du cache. S'il n'existe pas, il appelle l'utilisateur pour récupérer des données fraîches. Rien de grand ici. Ce que je voudrais faire pour garder la réponse accrocheuse est de sérialiser le fichier précédemment téléchargé et de le renvoyer à l'appelant - encore une fois rien de nouveau ... mais ... je veux générer un nouveau thread dès que le la sérialisation est terminée pour récupérer les nouvelles données et remplacer l'ancien fichier. C'est mon problème ...

Certes un programmeur intermédiaire - je suis tombé sur quelques exemples sur le multi-threading (ici d'ailleurs) ... Le problème est qu'il a introduit le concept de délégués et je suis vraiment aux prises avec ce.

Voici une partie de mon code:

//this method invokes another object that is responsible for making the 
    //http call, decompressing the file and persisting to the hard drive. 
    private static void downloadFile(string url, string LocationToSave) 
    { 
     using (WeatherFactory wf = new WeatherFactory()) 
     { 
      wf.getWeatherDataSource(url, LocationToSave); 
     } 
    } 

    //A new thread variable 
    private static Thread backgroundDownload; 

    //the delegate...but I am so confused on how to use this... 
    delegate void FileDownloader(string url, string LocationToSave); 

    //The method that should be called in the new thread.... 
    //right now the compiler is complaining that I don't have the arguments from 
    //the delegate (Url and LocationToSave... 
    //the problem is I don't pass URL and LocationToSave here... 
    static void Init(FileDownloader download) 
    { 
     backgroundDownload = new Thread(new ThreadStart(download)); 
     backgroundDownload.Start(); 
    } 

Je voudrais mettre en œuvre ce la bonne façon ... donc un peu d'éducation sur la façon de faire ce travail serait apprécié.

+0

Ainsi, vous disposez d'un cache, et que vous mettez à jour le cache en arrière-plan? Cela ne me semble pas si important, je vais vous écrire du code. – theMayer

+0

De nombreux livres ont été écrits sur le filetage. Vous ne pouvez pas en demander un ici, visitez votre bibliothèque locale ou une librairie. –

+0

Je ne parle pas vraiment de threading. Je demande plus ou moins comment utiliser les délégués avec threading. – JDBennett

Répondre

0

j'utiliser le Task Parallel library pour ce faire:

//this method invokes another object that is responsible for making the 
//http call, decompressing the file and persisting to the hard drive. 
private static void downloadFile(string url, string LocationToSave) 
{ 
    using (WeatherFactory wf = new WeatherFactory()) 
    { 
     wf.getWeatherDataSource(url, LocationToSave); 
    } 
    //Update cache here? 
} 

private void StartBackgroundDownload() 
{ 
    //Things to consider: 
    // 1. what if we are already downloading, start new anyway? 
    // 2. when/how to update your cache 
    var task = Task.Factory.StartNew(_=>downloadFile(url, LocationToSave)); 
} 
Questions connexes