2013-06-12 24 views
5

Obecnie pracuję nad wtyczką C# (mogę również używać Pythona) dla dwóch oddzielnych programów, które muszą się komunikować. W pierwszym pierwszym programie dekonstruuję geometrię 3D na krawędziach, punktach, normach itd. Następnie wysyłam wszystkie te dane do mojego pluginu w drugim programie, aby go odbudować. Idealnie byłoby tak szybko, jak to możliwe, aby utrzymać rzeczy "w czasie rzeczywistym".Wysyłanie dużych ilości danych między dwoma programami C#

Obecnie konwertuję moje dane za pomocą JSON i zapisuję JSON na dysk. Następnie mój drugi program obserwuje zmiany plików, a następnie odczytuje plik i korzysta z danych JSON.

Zdecydowanie największym szyjkiem butelki całej mojej wtyczki jest proces odczytu/zapisu. Musi być szybszy sposób niż zapisywanie do pliku.

+1

MemoryMappedFiles: http://msdn.microsoft.com/en-us/library/dd997372.aspx. Będziesz musiał trochę udostępnić na początku używając plików, ale potem wszystko będzie robione w pamięci RAM. –

+1

Użyj nazwanego potoku. Sprawdź 'NamedPipeServerStream' i' NamedPipeClientStream' –

+1

A MemoryMappedFile wprowadzi tyle problemów, ile rozwiązuje. –

Odpowiedz

3

Istnieje kilka sposobów korzystania z komunikacji międzyprocesowej.
Najbardziej znane są używane między różnymi komputerami: WCF (.NET 3.5) i Remoting (.NET 2)

Do komunikacji w komputerze można używać nazwanych potoków lub plików odwzorowanych w pamięci.

Pliki odwzorowane w pamięci są podobne do rozwiązania, ponieważ wykorzystują plik strony jako kopię zapasową.

Myślę, że rozwiązanie z nazwanymi rurami jest najwygodniejsze: Ustawiasz strumień "serwera" i czekasz, aż jakiś "klient" się połączy. Następnie przesyłasz dane w taki sam sposób, jak za pośrednictwem dowolnego innego strumienia.

Here's NamedPipeServerStream.
And this is NamedPipeClientStream.
Podany tam przykład kodu pokrywa go.

+0

Dzięki! Czytałem trochę o plikach mapowanych w pamięci, ale nie byłem pewien, czy to jest właściwa droga. Myślę, że spróbuję wypróbować nazwane rury. – rgathmann

0

Myślę, że WCF z nazwanymi potokami wykonałby zadanie, wystarczy utworzyć obiekty transferu, które będą serializowane i wszystko będzie wykonane przez WCF automagicznie, lub możesz po prostu przygotować istniejące obiekty do przeniesienia przez nazwanego fajka z naprawdę dużym obciążeniem. Użycie json byłoby fajne, ale tworzy dodatkową warstwę, a przy WCF przenosisz obiekty, które mogą być użyte od razu bez tłumaczenia przez json. (Naprawdę są one przetłumaczone na xml, ale nie robisz tego samemu, więc lepiej jest, jeśli mógłbyś zrobić to z jsonem).

Powiązane problemy