【问题标题】:How to track when my application has unexpectedly shut down?如何跟踪我的应用程序何时意外关闭?
【发布时间】:2010-04-20 20:51:57
【问题描述】:

我正在编写一个应用程序,其目的涉及记录大量不同的事件。其中,我还希望有一个应用程序被关闭的事件——即使是因为断电而意外。

当然,当停电时,我没有机会在任何地方写任何东西。所以我的想法是在某个已知位置连续写入时间戳(比如每分钟一次),当应用程序下次运行时,它可以确定意外关闭的大致时间。我可以接受 1 分钟的精度。

但是我担心操作系统和磁盘级别的缓存可能会干扰这种方法。有没有更好的方法或者如果没有 - 如何确保我刚刚写入的数据真的被写入物理介质?

补充:哦,差点忘了流行语:Windows XP 及以上; .NET 3.5; C#。

【问题讨论】:

    标签: c# .net file caching


    【解决方案1】:

    系统事件日志中记录了意外关闭。

    当您的应用程序完全关闭时,将其写入您的日志文件。下次您的应用程序启动时,请检查您的应用程序是否按预期方式关闭,否则请检查系统事件日志。

    【讨论】:

    • 大部分意外关机都记录在系统/应用程序事件日志中。检查事件日志仍然比每分钟写入时间戳更好。
    • 我的意思是应用程序也可能崩溃或被终止或其他东西。这不会在任何地方记录。
    • 如果它崩溃,它会记录到应用程序事件日志中,如果它被终止,那么 Windows 会向你的应用程序发送一条消息,你应该能够处理。
    • +1。如果您的应用程序崩溃,那么您将得到一个小型转储,告诉您确切的原因。如果计算机断电,将出现指示意外关机的事件。如果您只是定期“触摸”一个文件,则可以获得的信息要多得多。
    • 你能列出我应该检查/监控的所有事情以涵盖所有可能性吗?
    【解决方案2】:

    编辑:删除不正确的答案(由于没有正确阅读问题)

    您可以使用 FlushFileBuffers 方法,但这仍然只会将其写入设备,您仍然无法获得实际的驱动器来写入它(据我所知)。
    http://www.pinvoke.net/default.aspx/kernel32/FlushFileBuffers.html?diff=y

    【讨论】:

    • 不,这只会刷新 FileStrem 的内部缓冲区,而不是 OS 缓存。
    • 如果您担心毫秒或秒,我可以理解您为什么会担心这一点,但我从未经历过操作系统/磁盘会在不写入缓存的情况下将微小的东西保存几分钟。它可能发生在特殊情况或奇怪的配置中,但我认为这将是非常不寻常的。
    • 好吧,我找不到任何关于此的文档。确实,如果我能确定它会在几秒钟内被冲走,那就没问题了。否则我认为它可以无限期地在那里举行。而且由于该文件非常小并且经常被访问,我认为它很有可能永远留在缓存中(直到系统关闭)。
    • 我不是这方面的专家,但我认为你想错了。如果人们在保存后计算机崩溃时不断丢失他们已经保存的数据,那么 MS 会遇到很多麻烦。
    • 公平点。在这种情况下,甚至不需要调用Flush() - 我认为Close() 应该足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多