2015-07-28 1 views
0

Récemment, je découvre que l'exécution de quelques instances de la méthode compilée à .exe est plus rapide que l'exécution de la même méthode dans f.e. quelques nouvelles tâches. Je ne sais pas si cela s'applique à toutes les méthodes, mais cela permet d'obtenir des données de l'API.Comment faire pour exécuter la méthode de l'assembly chargé aux références, dans nouveau AppDomain

Je cherchais sur internet pour trouver comment gérer ça. J'ai eu des réponses pour essayer la méthode run dans new appDomains. Donc je crée l'assemblage .exe avec les méthodes que je veux exécuter (c'est l'application Console). Je le charge par un clic droit sur Références -> Ajouter une référence. Je pourrais facilement accéder à cette méthode par exeName.ClassName.Method (params). Le truc, c'est que je ne sais pas comment lancer cette méthode dans un nouvel appDomains. Chaque réponse que j'ai trouvée dans le web était avec l'assemblage chargé par le chemin.

Je serai également très heureux pour les réponses autres que la création de AppDomain. Je veux juste transmettre des données à cette méthode et obtenir des résultats. TL; DR: méthode exécutée dans Parallel.For (0,4, i => méthode()) fonctionne plus lentement que la même méthode dans 4 instances du fichier .exe compilé.

+0

Voulez-vous exécuter vos méthodes dans des processus distincts? ou dans des domaines d'application distincts. –

+0

Je ne m'inquiète pas tant que je pourrais envoyer l'objet à la méthode et obtenir le résultat. J'ai entendu parler des pipes, mais je ne peux pas trouver le tutoriel simple qui exécutera quelques instances de mon method.exe et obtiendra la réponse. – titol

Répondre

0

Vous pouvez utiliser une architecture multi-processus utilisant le protocole IPC ou héberger vos méthodes dans différents domaines. Dans les deux cas, je recommande .net remoting sur wcf parce que vous écrivez presque le même code pour les deux approches et parce que pour parler à une classe trouvée dans un autre domaine d'application hébergé dans le même processus, .net remoting est le seul moyen (malheureusement devs mais pas pour moi). MAIS je suis presque sûr que généralement cela ne serait pas plus rapide que de créer des threads et de les appeler de façon asynchrone. La communication inter-domaines/processus doit s'appuyer sur la sérialisation/désérialisation des messages qui ajoute une énorme surcharge, en particulier si la méthode s'appelle elle-même très légère.

0

Après quelques recherches et en demandant que j'ai trouvé la solution:

var ad = AppDomain.CreateDomain("mydomain"); 
ad.DoCallBack(() => 
      { 
       //stuff to do 
      } 

Probablement, il y aura quelques problèmes avec les données de passage à la nouvelle AppDomain. Pour moi moyen le plus simple est:

ad.SetData("key", value); 

et retrive dans AppDomain:

var value = (valueType)AppDomain.CurrentDomain.GetData("key");