自应用启动以来经过的时间

28

我正在将一个应用程序从ActionScript3.0(Flex)移植到C#(WPF)。AS3.0有一个方便的实用程序称为getTimer(),它返回自Flash虚拟机启动以来经过的时间(以毫秒为单位)。我在C#中通过类搜索

DateTime
DispatcherTimer
System.Diagnostics.Process
System.Diagnostics.Stopwatch

但是我找不到类似的东西。对我来说,这似乎是一个非常基本的功能。例如在运行在Mono上的Unity3D中有一些类似的功能。我错过了某些实用程序吗?

提前感谢。

2个回答

60
Process.GetCurrentProcess().StartTime是您的好朋友。
..所以要获取自启动以来经过的时间:
DateTime.UtcNow - Process.GetCurrentProcess().StartTime.ToUniversalTime()

或者,如果您需要更多定义,则System.Diagnostics.Stopwatch可能更可取。如果是这样,请在应用程序启动时启动秒表计时:

Stopwatch sw = Stopwatch.StartNew();

然后在执行时查询 sw.Elapsed 属性。


选择其中之一并不是精度问题,而是根据需求而定。Process.GetCurrentProcess().StartTimeStopwatch.StartNew() 永远不会同时被调用!因此,这取决于用户想要何时开始计时。 :) - as-cii
你确定 Process.GetCurrentProcess 返回的是应用程序启动后的时间吗?我刚刚进行了检查:(DateTime.Now -Process.GetCurrentProcess().StartTime).TotalSeconds。在应用程序启动时,我将时间打印到控制台。它从16-17秒开始。显然太长了,因为应用程序最多只需要4秒钟才能启动。 - Michael IV
有趣。文档似乎支持我的观点。如果真是这样的话,我认为它值得提出一个新问题。 - spender
Process.GetCurrentProcess().StartTime 对我不起作用。顺便说一下,我不在 Unity 上。Stopwatch 对我有用。 - Syaiful Nizam Yahya
这个能用来确定所有会话的总时间还是只能用于当前活动会话? - ina
显示剩余2条评论

1
public static class Runtime
{
    static Runtime() 
    {
        var ThisProcess = System.Diagnostics.Process.GetCurrentProcess(); LastSystemTime = (long)(System.DateTime.Now - ThisProcess.StartTime).TotalMilliseconds; ThisProcess.Dispose();
        StopWatch = new System.Diagnostics.Stopwatch(); StopWatch.Start();
    }
    private static long LastSystemTime;
    private static System.Diagnostics.Stopwatch StopWatch;

    //Public.
    public static long CurrentRuntime { get { return StopWatch.ElapsedMilliseconds + LastSystemTime; } }
}

然后调用:Runtime.CurrentRuntime 以获取程序当前的运行时间(以毫秒为单位)。

注意:您可以将 TotalMilliseconds / ElapsedMilliseconds 替换为任何其他所需的时间度量。


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