3

GUIとJust Runの2つのモードを持つプログラムがあります。GUI は WPF フォームをロードし、設定を調整できるようにします。一方、Just Run は上記の設定をロードし、ただ...まあ...実行します。

ファイルをバッチ移動するための、栄光に満ちたカスタマイズ可能なツールです。

問題: 「ログ」が終わらない。プログラムが閉じている間も書き込みを続けているように見えるため、ログの終わりが途切れています。

アプリ本体:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        if (!e.Args.Contains("-gui"))
        {
            Process.SettingsPopulate();
            Process.WriteLogHead();
            Process.MoveFiles();
            Process.WriteLogEnd();
        }
        else
        {
            new MainWindow().ShowDialog();
        }
        this.Shutdown();
    }
}

実にシンプル。コマンドラインに -gui がある場合、WPF をロードします...そうでない場合は、実行するだけです。

    public static void WriteLogEnd()
    {
        foreach (var log in from i in Items
                            where i.Used == false
                            let build = new StringBuilder()
                            select build.AppendFormat("{0, -12} > {1} > Not Found", _time, i.FileName))
        {
            Logs(log);
        }

        Logs("");
        Logs("Fin.");
    }

ログは、単純な「コンソールに書き込み、ファイルに書き込む」方法です。処理されたファイルのリストを反復処理し、使用されていないアイテムを見つけます...別名「見つかりません」。リストを終了し、Fin を書き込む前に閉じます。

私は当惑しましたか。WriteLogEnd が終了する前にファイルが閉じないようにするにはどうすればよいですか (とにかく、その前に終了することはできないはずです)。

4

2 に答える 2

2

デバッガーでコマンド ライン モードで実行して、例外がスローされているかどうかを確認するか、OnStartup ルーチンのコードを try..catch で囲みます。

プロセスのいずれかのスレッドで例外が処理されない場合、プロセス全体が突然終了します。

また、ログを書き込んでいるファイルまたはストリームを閉じていることを確認してください。最近ではほとんどのファイル I/O がバッファリングされており、ストリームを正しく閉じないと、最後のバッファに相当するデータが出力デバイスにコミットされない可能性があります。

于 2010-09-28T21:06:20.650 に答える
2

ログは、単純な「コンソールに書き込み、ファイルに書き込む」方法です。

ファイルに書き込む場合は、Logs.Close() などを追加します。キャッシュをフラッシュするには、FileStream を閉じる必要があります。

于 2010-09-28T21:19:40.197 に答える