C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
掲示板トップ
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
上記ツリーを一括表示
/
上記ツリーをトピック表示
上記の記事へ返信
入力内容にタグは利用できません。
他人を中傷する記事は管理者の判断で予告無く削除されます。
半角カナは使用しないでください。文字化けの原因になります。
名前、コメントは必須記入項目です。記入漏れはエラーになります。
入力内容の一部は、次回投稿時の手間を省くためブラウザに記録されます。
URL は自動的にリンクされます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
名前
(*必須)
E-Mail (任意)
Web サイト (任意)
投稿モード
通常モード
図表モード (ソースコードを貼る場合はこちらを使用)
本文
(質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
■No103936 (Tom さん) に返信 > Azuleanさま > 魔界の仮面弁士さま > アドバイス、ありがとうございます。 > > >・Windows Vista 以降では、FormClosing/FormClosed で長時間の処理をすることは非推奨になっています。 > >・シャットダウン契機で発せられる FormClosing は 5 秒以内の完了が求められるはず。 > 設計当初はこんなに大量の書き込み量になるとは思っていなかった(件数もさることながら1行のデータが当初の数倍に>_<)ので、いつのまにか5秒じゃすまない非推奨の領域になってしまっていました。 > > >新規ファイルではなく上書き保存が必要な場合、アイドル時には別ファイルに残しておいて、 > >終了時にそれを File.Replace で入れ替えるパターンもありますね。 > >既に作成しておいたファイルとの置換だけなら短い時間で終わるので。 > なるほど! たしかに全レコードが書き換わっているわけではないので更新部分のみにすればサクッとおわりますね。 > いまテキストファイルにかいてるけど、簡易DB形式にするのがよいかなぁ > それともブロック単位でファイル分けて必要部分だけ更新か。 > > >Stream はいつ開いて、いつ閉じていますか? > >頻繁に開いたり閉じたりを繰り返しているのか、 > >それともアプリが起動している間、共有あるいは排他で開き続けているのか。 > 起動時にテキストファイル形式を読み込んで、あとは最新化要求時に内部データの該当ブロック部分をdeleteして取得しなおしたものをadd、そしてアプリ終了時に内部データ全レコードをテキストファイル形式で保存しています。 > この最後の保存がいま問題の箇所です。 > > >頻繁に開いたり閉じたりを繰り返しているのであれば、編集モードでファイルを開き続けておき、 > >「50万件出力」と「数十行出力」部が、同一の Stream インスタンスに対して > >処理されるようにすれば、50万部だけが欠損するようなことを防げる気がします。 > 読み書きはアプリ起動時と終了時に行うだけの単純な設計です。 > そのため全レコード一括で読み書きのシーケンシャルアクセス方式にしていました。 > シーケンシャルアクセスではなくランダムアクセス方式にして該当部分のみを差し替え ってことですね。 > 1件のサイズが不定なのでいまのテキストファイル形式だと難しそうです。 > > > こちらでもいろいろ調べていたら「一回のFlashでやるとバッファが溢れてると間に合わない可能性があるので、大量のデータの場合一定件数ごとにFlashを行う」って記事をみました。 > Flashは最後に行うもの って思い込んでいたので、目から鱗でした。 > あと、内部データ最新化するタイミングは別にアプリ終了直前って訳ではないので、内部データ最新化した時点で即時それをテキストファイルに書き込みをするように変更し、アプリ終了時には書き込みを行わないようにしてみます。 > 1度のアプリ起動中に何度もファイル書き込みする仕様変更になるので、ちょっとパフォーマンス劣化するかもですが別プロセスでおこなうとかすれば問題ないし、そのパフォーマンスもブロック化かDB化できれば改善しそう。 > > 大変有意義なアドバイス、本当にありがとうございました。 > 早速いろいろ試してみます。 > > > >
編集キー
自分の投稿を編集する時に必要です
(半角8文字以内)
解決済み
/
解決したらチェックしておきましょう。
プレビュー/
管理者用
-
Child Tree
-