系统范围持久存储?

时间:2009-03-23 17:36:50

标签: c# .net windows multithreading

我的程序启动一个进程,我需要确保它在我再次运行程序之前被杀死。为此,我想将Process的开始时间存储在我以后可以检索的互斥锁中,并检查是否有任何进程具有匹配的名称和开始时间。

我怎么能这样做?我真的不想在用户退出后坚持使用硬盘上的任何东西。

供参考我正在使用C#和.NET

2 个答案:

答案 0 :(得分:4)

您希望存储进程ID,而不是进程名称和开始时间。这样可以简化程序。 您可以将文件存储在%TMP%中,以便在硬盘空间不足时清理它。

杀死进程的C#代码如下所示:

    int pid = Convert.ToInt32(File.ReadAllText(pidFile));
    Process proc = Process.GetProcessById(pid);
    proc.Kill();

您可以找到%TMP%目录,如下所示:

var tmp = Environment.GetEnvironmentVariable("TMP"); 

编辑:PID可以重复使用,所以你也需要处理它。

答案 1 :(得分:2)

我同意rossfabricant应该存储进程ID而不是名称。在重新启动之前,不会重复使用进程ID,因此这应该是安全的。

但是,我建议不要使用TMP环境变量进行存储,而是查看Isolated Storage。就存储而言,这将更加面向.NET。此外,它会降低运行应用程序所需的安全性。

不幸的是,临时目录和隔离存储都会在注销后保留,因此您需要逻辑来处理这种情况。 (但是,您的应用可以清除关闭时的信息)。

如果您可以访问正在启动的进程代码,那么最好使用命名管道或共享内存等内容来检测应用程序是否正在运行。这也为您提供了一种更清洁的关闭流程的方法。杀死一个进程应该是最后的手段 - 一般来说,我不会构建一个应用程序,如果设计完全可以避免,那么设计需要杀死一个进程。