有没有一种方法可以确定应用程序池(在 IIS7 中)已经在 c# 中运行了多长时间(自启动以来的时间,或上次重新启动的时间)?
7 回答
DateTime.Now - Process.GetCurrentProcess().StartTime
Process.GetCurrentProcessInfo()
不存在。
真正愚蠢的技巧:在所有东西都使用的某个类中,使用类构造函数来记住您的开始时间并使用 aspx 页面来接收它。现在与当前时间进行比较。
从 ASP.NET 应用程序中,您可以尝试TimeSpan uptime = (DateTime.Now - ProcessInfo.GetCurrentProcessInfo ().StartTime)
基于以上,我创建了一个像这样的简单类..
public static class UptimeMonitor
{
static DateTime StartTime { get; set; }
static UptimeMonitor()
{
StartTime = DateTime.Now;
}
public static int UpTimeSeconds
{
get { return (int)Math.Round((DateTime.Now - StartTime).TotalSeconds,0); }
}
}
并在 Global.asax.cs 中的 Application_Start() 中调用它
var temp = UptimeMonitor.UpTimeSeconds;
然后可以在任何地方使用
UptimeMonitor.UpTimeSeconds
如果您发现另一个用户提到的 Process.GetCurrentProcessInfo() 不存在,
System.Diagnostics.Process.GetCurrentProcess().StartTime
可能对你有用。
(我想将此作为评论添加到 Eric Humphrey 的帖子中,但我不被允许)
我个人使用的两种方法之一。使用静态类(如@Original10 的答案所示)或使用Application
变量。
我发现使用Application
变量是可以接受的,因为我注意到Process.GetCurrentProcess()
应用程序重新启动后仍然存在(例如修改 web.config 或 bin 目录)。我需要一些能够满足网站重启的东西。
在您的 Global.asax 中,将以下内容添加到
public void Application_Start(Object sender, EventArgs e)
{
...
Application["ApplicationStartTime"] = DateTime.Now.ToString("o");
}
在您需要它的代码中,您可以执行以下操作:
var appStartTime = DateTime.MinValue;
var appStartTimeValue = Web.HttpCurrent.Application["ApplicationStartTime"].ToString();
DateTime.TryParseExact(appStartTimeValue, "o", null, Globalization.DateTimeStyles.None, Out appStartTime);
var uptime = (DateTime.Now - appStartTime).TotalSeconds
var lsOutput = $"Application has been running since {appStartTime:o} - {uptime:n0} seconds."
这将产生类似的东西
Application has been running since 2018-02-16T10:00:56.4370974+00:00 - 10,166 seconds.
如果需要,不检查应用程序变量或锁定应用程序。我将把它作为练习留给用户。