C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103936 / 7階層)  FormClosingでセーブするが稀に最後まで書込まれない
□投稿者/ Tom (4回)-(2026/05/16(Sat) 12:54:49)
Azuleanさま
魔界の仮面弁士さま
アドバイス、ありがとうございます。

>・Windows Vista 以降では、FormClosing/FormClosed で長時間の処理をすることは非推奨になっています。
>・シャットダウン契機で発せられる FormClosing は 5 秒以内の完了が求められるはず。
設計当初はこんなに大量の書き込み量になるとは思っていなかった(件数もさることながら1行のデータが当初の数倍に>_<)ので、いつのまにか5秒じゃすまない非推奨の領域になってしまっていました。

>新規ファイルではなく上書き保存が必要な場合、アイドル時には別ファイルに残しておいて、
>終了時にそれを File.Replace で入れ替えるパターンもありますね。
>既に作成しておいたファイルとの置換だけなら短い時間で終わるので。
なるほど! たしかに全レコードが書き換わっているわけではないので更新部分のみにすればサクッとおわりますね。
いまテキストファイルにかいてるけど、簡易DB形式にするのがよいかなぁ
それともブロック単位でファイル分けて必要部分だけ更新か。

>Stream はいつ開いて、いつ閉じていますか?
>頻繁に開いたり閉じたりを繰り返しているのか、
>それともアプリが起動している間、共有あるいは排他で開き続けているのか。
起動時にテキストファイル形式を読み込んで、あとは最新化要求時に内部データの該当ブロック部分をdeleteして取得しなおしたものをadd、そしてアプリ終了時に内部データ全レコードをテキストファイル形式で保存しています。
この最後の保存がいま問題の箇所です。

>頻繁に開いたり閉じたりを繰り返しているのであれば、編集モードでファイルを開き続けておき、
>「50万件出力」と「数十行出力」部が、同一の Stream インスタンスに対して
>処理されるようにすれば、50万部だけが欠損するようなことを防げる気がします。
読み書きはアプリ起動時と終了時に行うだけの単純な設計です。
そのため全レコード一括で読み書きのシーケンシャルアクセス方式にしていました。
シーケンシャルアクセスではなくランダムアクセス方式にして該当部分のみを差し替え ってことですね。
1件のサイズが不定なのでいまのテキストファイル形式だと難しそうです。


こちらでもいろいろ調べていたら「一回のFlashでやるとバッファが溢れてると間に合わない可能性があるので、大量のデータの場合一定件数ごとにFlashを行う」って記事をみました。
Flashは最後に行うもの って思い込んでいたので、目から鱗でした。
あと、内部データ最新化するタイミングは別にアプリ終了直前って訳ではないので、内部データ最新化した時点で即時それをテキストファイルに書き込みをするように変更し、アプリ終了時には書き込みを行わないようにしてみます。
1度のアプリ起動中に何度もファイル書き込みする仕様変更になるので、ちょっとパフォーマンス劣化するかもですが別プロセスでおこなうとかすれば問題ないし、そのパフォーマンスもブロック化かDB化できれば改善しそう。

大変有意義なアドバイス、本当にありがとうございました。
早速いろいろ試してみます。




編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[6]: FormClosingでセーブするが稀に最後まで書込まれない /魔界の仮面弁士 返信無し
 
上記関連ツリー

FormClosingでセーブするが稀に最後まで書込まれない / Tom (26/05/05(Tue) 11:26) #103927
Re[1]: FormClosingでセーブするが稀に最後まで書込まれない / 魔界の仮面弁士 (26/05/05(Tue) 17:57) #103929
  └ Re[2]: FormClosingでセーブするが稀に最後まで書込まれない / 魔界の仮面弁士 (26/05/05(Tue) 18:53) #103930
    └ Re[3]: FormClosingでセーブするが稀に最後まで書込まれない / Tom (26/05/06(Wed) 13:09) #103931
      └ Re[4]: FormClosingでセーブするが稀に最後まで書込まれない / Tom (26/05/13(Wed) 20:50) #103933
        └ Re[5]: FormClosingでセーブするが稀に最後まで書込まれない / Azulean (26/05/13(Wed) 22:06) #103934
          └ Re[6]: FormClosingでセーブするが稀に最後まで書込まれない / 魔界の仮面弁士 (26/05/14(Thu) 11:41) #103935
            └ FormClosingでセーブするが稀に最後まで書込まれない / Tom (26/05/16(Sat) 12:54) #103936 ←Now

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信