程序在完全结束之前关闭了。

3

我有一个程序,有两种模式:GUI和Just Run。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完成之前关闭(因为根据我所知,在此之前它不应该能够结束)。


有任何线程正在使用吗? - PostMan
没有线程。等我再次接近代码时,我会编辑并添加写方法,尽管它很短。 - WernerCD
2个回答

2

在调试器中以命令行模式运行它,以查看是否抛出异常,或者在您的OnStartup例程中将代码放在try..catch块中。

如果进程的任何线程中存在未处理的异常,则整个进程会突然终止。

还要确保关闭写入日志的任何文件或流。大多数文件I/O现在都是缓冲的,如果您没有正确关闭流,则最后一个缓冲区的数据可能不会提交到输出设备。


2

日志是一种简单的“写入控制台,写入文件”的方法。

如果要写入文件,请添加Logs.Close()或类似的方法。您必须关闭FileStream以刷新其缓存。


应用退出时它难道不会刷新吗? - PostMan
嗯...我想我没有在任何地方使用StreamWriter.Close。我得试试,没想到它只是“刷新”东西。 - WernerCD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接