2013-06-12 21 views
5

Şu anda iletişim kurması gereken iki ayrı program için bir C# (python da kullanabilirim) eklentisi üzerinde çalışıyorum. İlk ilk programda, 3 boyutlu geometriyi kenarlara, noktalara, normlara, vb. Dönüştürüyorum. Daha sonra yeniden oluşturulacak olan ikinci programımda tüm bu verileri eklentimime gönderdim. İdeal olarak bu, işleri "gerçek zamanlı" tutmak için olabildiğince hızlı olur.İki C# programı arasında büyük miktarda veri gönderme

Şu anda verilerimi JSON ile dönüştürüyorum ve JSON'u diske yazıyor. Sonra ikinci programım dosya değişiklikleri için izler, sonra dosyayı okur ve JSON verilerini kullanır. Tüm eklentimin en büyük şişe boynu, okuma/yazma işlemidir. Bir dosyaya yazmanın daha hızlı bir yolu olmalı.

+1

MemoryMappedFiles: http://msdn.microsoft.com/en-us/library/dd997372.aspx. Dosyaları kullanarak başlangıçta biraz paylaşmanız gerekecek, ancak bundan sonra her şey RAM'de yapılacak. –

+1

Adlandırılmış bir boru kullanın. 'NamedPipeServerStream' ve' NamedPipeClientStream' –

+1

'a bakın Bir MemoryMappedFile çözdüğü kadar çok sorunla karşılaşır. –

cevap

3

Süreçler arası iletişimi kullanmanın birkaç yolu vardır.
En iyi bilinenler farklı makineler arasında kullanılır: WCF (.NET 3.5) ve Uzaklaştırma (.NET 2)

Makinede iletişim için Adlandırılmış borular veya Bellek eşlenmiş dosyaları kullanmayı seçebilirsiniz.

Bellek eşlemeli dosyalar, sayfa dosyasını yedek olarak kullanmaları nedeniyle çözümünüze benzer.

Adlandırılmış borular çözümünün en uygun olduğunu düşünüyorum: Bir "sunucu" akışı oluşturuyorsunuz ve bazı "istemci" nin bağlanmasını bekliyorsunuz. Ardından verileri tıpkı diğer akışlarda yaptığınız gibi aktarırsınız.

Here's NamedPipeServerStream.
And this is NamedPipeClientStream.
Kod örneği oldukça fazla kapsar.

+0

Teşekkürler! Bellek eşlemeli dosyalar hakkında biraz bilgi okumuştum, ama bu yolun gitmesi gerektiğinden emin değildim. Sanırım adlandırılmış boruları deneyeceğim. – rgathmann

0

WCF adlı adlandırılmış borularla işi yapacağımı düşünüyorum, sadece serileştirilecek aktarım nesnelerini oluşturmalısınız ve tüm bunlar otomatik olarak WCF tarafından yapılacaktır veya varolan nesneleriniz isimle aktarılacaksınız. Gerçekten büyük havai olmayan boru. Json kullanmak güzel olurdu ama ek katman oluşturur ve WCF ile json tarafından çeviri yapılmadan hemen kullanılabilen nesneleri aktarırsınız. (Gerçekten xml'ye çevriliyorlar ama siz bunu kendi başınıza yapmıyorsunuz, o zaman daha iyisi o zaman jüriyi ayrıştırma ile yapabilirsiniz).

İlgili konular