2013-06-12 11 views
5

Attualmente sto lavorando a un plug-in C# (potrei usare anche python) per due programmi separati che devono comunicare. Nel primo primo programma, decostruisco la geometria 3D in bordi, punti, normali, ecc. Quindi invio tutti questi dati al mio plug-in nel mio secondo programma per essere ricostruito. Idealmente ciò accadrebbe il più velocemente possibile per mantenere le cose in "tempo reale".Invio di grandi volumi di dati tra due programmi C#

Attualmente sto convertendo i miei dati con JSON e scrivendo il JSON sul disco. Quindi il mio secondo programma controlla le modifiche ai file, quindi legge il file e utilizza i dati JSON.

Di gran lunga il collo di bottiglia più grande dell'intero plug-in è il processo di lettura/scrittura. Ci deve essere un modo più veloce di scrivere su un file.

+1

MemoryMappedFiles: http://msdn.microsoft.com/en-us/library/dd997372.aspx. Dovrai fare un po 'di condivisione all'inizio usando i file, ma dopo sarà tutto fatto su RAM. –

+1

Utilizzare una pipe denominata. Controlla 'NamedPipeServerStream' e' NamedPipeClientStream' –

+1

Un MemoryMappedFile introdurrà tutti i problemi che risolve. –

risposta

3

Esistono diversi modi per utilizzare la comunicazione tra processi.
I più noti vengono utilizzati tra diverse macchine: WCF (.NET 3.5) e Remoting (.NET 2)

Per la comunicazione su macchina è possibile scegliere di utilizzare pipe con nome o file mappati in memoria.

I file mappati in memoria sono simili alla soluzione in quanto utilizzano il file di paging come backup.

Penso che la soluzione Named pipe sia la più comoda: Si imposta uno stream "server" e si attende che un "client" si connetta. Quindi trasferisci i dati come faresti con qualsiasi altro stream.

Here's NamedPipeServerStream.
And this is NamedPipeClientStream.
L'esempio di codice lo copre praticamente.

+0

Grazie! Avevo letto un po 'sui file mappati in memoria, ma non ero sicuro se quella fosse la strada da percorrere. Penso che darò un nome a pipe. – rgathmann

0

Penso che WCF con named pipe farebbe il lavoro, devi solo creare oggetti di trasferimento, che saranno serializzati e sarà tutto fatto da WCF automagicamente, oppure puoi semplicemente preparare gli oggetti esistenti da trasferire con nome pipe con un overhead non proprio grande. Usare json sarebbe bello ma crea un ulteriore livello, e con WCF si trasferiscono oggetti che possono essere usati subito senza traduzione da parte di json. (Veramente sono tradotti in xml ma non lo fai da solo, quindi è meglio che tu possa fare con l'analisi json, credo).

Problemi correlati