プロセス間のC#共有メモリ通信
C Shared Memory Communication Between Processes
2.1永続メモリマップファイル
既存のファイルに基づいて、指定された共通名でメモリマップトファイルを作成します
using (var mmf = MemoryMappedFile.CreateFromFile(@'c: memory mapped file.data',FileMode.Open, 'Common name')) { //Create a memory-mapped file view server with the specified offset and size using (var accessor = mmf.CreateViewAccessor(offset, length)) //Offset, can control the memory location of data storage size, used to control the space occupied by storage { //Marshal provides a set of methods for allocating unmanaged memory, copying unmanaged memory blocks, converting managed types to unmanaged types, and other miscellaneous methods used when interacting with unmanaged code. int size = Marshal.SizeOf(typeof(char)) //Modify the memory map file view for (long i = 0 isize) { char c= accessor.ReadChar(i) accessor.Write(i, ref c) } } } //Another process or thread can open an existing memory mapped file with the specified name in the system memory using (var mmf = MemoryMappedFile.OpenExisting('Common name')) { using (var accessor = mmf.CreateViewAccessor(4000000, 2000000)) { int size = Marshal.SizeOf(typeof(char)) for (long i = 0 i size) { char c = accessor.ReadChar(i) accessor.Write(i, ref c) } } }
2.2非永続メモリマップファイル
ディスク上の既存のファイルにマップされていないメモリマップファイル
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew('testmap', 10000)) { bool mutexCreated //Inter-process synchronization Mutex mutex = newMutex(true, 'testmapmutex', out mutexCreated) using (var stream = mmf.CreateViewStream()) //Create file memory view stream stream-based operation { var writer = newBinaryWriter(stream) writer.Write(1) } mutex.ReleaseMutex() Console.WriteLine('Start Process B and press ENTER to continue.') Console.ReadLine() mutex.WaitOne() using (MemoryMappedViewStream stream = mmf.CreateViewStream()) { var reader = newBinaryReader(stream) Console.WriteLine('Process A says: {0}', reader.ReadBoolean()) Console.WriteLine('Process B says: {0}', reader.ReadBoolean()) } mutex.ReleaseMutex() } using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting('testmap')) { Mutex mutex = Mutex.OpenExisting('testmapmutex') mutex.WaitOne() using (var stream = mmf.CreateViewStream(1, 0))//Note the offset here { var writer = newBinaryWriter(stream) writer.Write(0) } mutex.ReleaseMutex() }
2.3完全なデモ
C#共有メモリの非永続通信の例。通信中のスレッドとプロセスの制御に問題はありません。以下は実装されたコードです。
最初にメッセージサービスIMServer_Messageを開始し、
状態サービスIMServer_Stateを再起動します。
IMServer_Message一度入力します(共有メモリの共通名と共通スレッドロックを作成し、ビューストリームモードで共有メモリを書き込みます)、
IMServer_Stateを1回入力します(共有メモリを取得し、ビューストリームモードで書き込み、ビューアクセサーの書き込み構造タイプ)
そして、すぐにIMServer_Messageをもう一度入力します(今書いたメッセージを読んでください)。
IMServer_State画面の表示の変化を観察し、約5秒間待機します(スレッドロック)(スレッドロックが解除されます)
IMServer_Messageの画面表示を確認します(共有メモリに書き込まれたばかりのメッセージを表示します)
IMServer_Message.exe コード
コードを見るIMServer_State.exe コード
コードを見る2.4マルチスレッド同期とデータ共有の場合
このプロジェクトには2つの例があります。最初の例はDEMOフォルダーにあります。これはマルチプロセス同期テクノロジーです。 main関数で実行する必要があります。 2番目の例では、プロジェクトを直接開いて実行し、複数のプロセスのメモリデータを共有できます。共有、同期テクノロジーはセマフォを使用します。
ダウンロードリンク: MultiProcess.rar
コメントしてプログラムを改善することを歓迎します、それがあなたを助けるならば、それを好きにしてください:)。
参考記事
この記事は、元のリンクであるwenglabsブログガーデンブログから転送されます:http://www.cnblogs.com/arxive/p/7222185.html、転載が必要な場合は原作者にご連絡ください