Question

J'ai un problème de conception intéressant et j'espérais que vous pourrez tous faire quelques suggestions. J'utilise C # et .NET 3.0

J'ai un très beau cadre extensible construit sur WCF qui automatise la configuration des points de terminaison et la création de contrats. Le système dans lequel je travaille peut être exploité de différentes manières: les ordinateurs d'extrémité peuvent se trouver ailleurs sur Internet, être exécutés dans des assemblages différents sur le même boîtier ou même dans le même processus. WCF est idéal pour rendre tout cela transparent, mais dans le dernier cas, j'aimerais améliorer l'efficacité:

J'aimerais éviter les frais généraux liés à la sérialisation d'objets qui ne vont pas vraiment n'importe où. Cela ne sert à rien de faire cela pour communiquer entre deux threads dans le même assemblage. En même temps, j'aimerais utiliser le cadre déjà en place basé sur la WCF, car il sera beaucoup plus facile à maintenir si nous n’avons pas deux voies de communication distinctes en fonction de la configuration du système.

Ma première pensée a été d'utiliser des pointeurs d'objet dans un contexte dangereux - pour ne pas lutter contre la sérialisation, mais pour ne sérialiser que la quantité minimale. Ce qui me préoccupe, c'est que, sur les messages asynchrones dans des environnements où le GC est agressif, le message pourrait disparaître avant que nous puissions déréférencer le pointeur qu'il contient, ce qui poserait de nombreux problèmes.

Ma pensée suivante était d’utiliser GCHandles, mais je ne suis pas sûr de leur comportement. Si un GCHandle n’est plus référencé, mais contient une référence à un objet géré, est-il nettoyé par le GC, ou l’un ou l’autre? Cela m'inquiète d'introduire une énorme fuite de mémoire, car les chances de perdre un message sont grandes, et nous ne pourrons pas appeler Free (), et la documentation que je peux trouver est… manquante .

Une autre idée consiste à utiliser la réflexion pour examiner tous les objets gérés, mais il semble que les frais généraux seraient énormes, et que ce système doit être aussi efficace que possible.

Donc, en résumé, j'essaie d'envoyer un objet à travers un processus avec WCF sans le sérialiser, ce qui, autant que je sache, signifie le garder en vie même s'il n'a temporairement aucune référence. Il semble que cela devrait être possible, mais je me demande si j'essaie d'avoir mon gâteau et de le manger aussi.

Merci beaucoup pour votre contribution!

Était-ce utile?

La solution

J'examinerais les "NetNamedPipes". Protocole de transport dans WCF spécialement conçu pour les communications inter-processus entre ordinateurs et même machine et avec le moins de temps système possible (y compris la sérialisation binaire rapide).

Marc

Autres conseils

Découvrez la liaison de transport null dans cet article.

http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top