- ベストアンサー
C#のメモリマップドファイルについて
- C#のメモリマップドファイルを使用して、アプリケーションAからアプリケーションBに情報を渡す方法について調査しています。
- アプリケーションAでメモリマップドファイルを生成し、キー入力された数値を書き込む方法を検討しています。
- しかし、実際に試してみると、アプリケーションAで生成したファイルはキーイベントから抜けた時点で消滅してしまうようです。アプリケーションAのフォームを閉じない限りファイルを残したままにする方法を教えていただけませんか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
usingステートメントは理解されていますか? アプリケーションAで > using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("myMemmapFile", 10000)) > { とありますが、usingステートメントは続くブロックを抜ける時mmfのオブジェクトのdisposeメソッドを呼んで破棄します。 KeyUpイベントハンドラ中で、作成→破棄されているわけです。 アプリケーションAのフォームのコンストラクタでメモリマップドファイルを作成し、フィールド変数でフォームが生きている間保持していれば、ひとまず問題は解決すると思われます。
その他の回答 (1)
- axsies
- ベストアンサー率64% (38/59)
ソースがわからないので何とも言えませんが、イベントハンドラのどこかでメモリマップドファイルを閉じてしまっているのでは? 少なくともアプリケーションBがその数値の読み取りを必要としている限り、メモリマップドファイルを閉じてはなりません。 単純な方法としては、アプリケーションAがフォームを開いている間は常にメモリマップドファイルを開いている状態しておけばよいのではないでしょうか。
お礼
早速の回答、有り難うございます。 ネットからの情報を基に試行錯誤しており、100%理解できている訳ではないのですが、ソースは以下のとおりです。 ファイル読み出しは実際には1秒のタイマーイベントで行っています。 また、最初はMutexで同期を取っていましたが取り敢えず余計なものは削除してあります。(Mutexを入れても症状は同じです) これらを走らせるとアプリケーションBで常に"Err"が表示されます。 デバッガでステップ実行させるとusing (var mmf = MemoryMappedFile.OpenExisting("myMemmapFile"))の次に例外が発生しています。 >少なくともアプリケーションBがその数値の読み取りを必要としている限り、メモリマップドファイル >を閉じてはなりません。 > ファイルは開いたままになっていると考えているのですが…。 修正点や確認事項などありましたらご指摘頂ければ有難いです。 どうぞ宜しくお願いします。 【アプリケーションA ファイル生成メソッド(キーイベント)】 private void txWrite0_KeyUp(object sender, KeyEventArgs e) { using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("myMemmapFile", 10000)) { using (var stream = mmf.CreateViewStream()) using (StreamWriter sw = new StreamWriter(stream)) { string s = txWrite0.Text; sw.WriteLine(s); } } } 【アプリケーションB ファイル読み出しメソッド(タイマーイベント)】 private void Mmfdisp() { try { using (var mmf = MemoryMappedFile.OpenExisting("myMemmapFile")) using (var stream = mmf.CreateViewStream()) using (StreamReader sr = new StreamReader(stream)) { string line = sr.ReadLine(); txDisp.Text = line; } txError.Text = ""; } catch { txError.Text = "Err"; } }
お礼
再度の回答、有り難うございました。 >usingステートメントは続くブロックを抜ける時mmfのオブジェクトのdisposeメソッドを呼んで破棄します。 > なるほど、そう言うことだったんですかぁ。 よく分かりました。 ネットから拾ったソースを自分なりに解釈して使っていたんですが、理解できていませんでした。 助言頂いた様にすると期待通りの動きとなりました。 1週間以上ネットで調べたのですが解決できず、落胆していたのでとっても嬉しいです!本当に感謝しています。