如何获取当前进程的ID?

106

使用.NET框架,从你的应用程序内部获取当前进程ID的最简单方法是什么?


2
真的。我猜这里出了些问题 :D @VictorYarema - Deniz
3个回答

146

获取当前进程的引用,使用System.DiagnosticsProcess.Id属性:

int nProcessID = Process.GetCurrentProcess().Id;

2
使用 System.Diagnostics; 或者 System.Diagnostics.Process.GetCurrentProcess().Id; 我总是保护自己,并假设当前或将来的策略规则会以某种受限制的模式限制此调用,因为它访问了进程区域。 - Sql Surfer

36
即将推出的 .NET 5 引入了 Environment.ProcessId,应该优先使用它而不是 Process.GetCurrentProcess().Id,因为它避免了分配内存和处理过程对象的需要。 https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/ 显示,在一个基准测试中,Environment.ProcessId 只需要 3ns,而 Process.GetCurrentProcess().Id 则需要 68ns。

看起来更喜欢Environment.ProcessId是合理的,因为它更简洁。但是您让我想知道会有什么类型的应用程序频繁运行这个,以至于额外的65纳秒会和任何相关重要事项相加。 - BVernon
3
@BVernon 保存的65不是全部。您还应该处理Process实例。Process实例还运行一个终结器,需要额外的(GC)时间,并且每个Process实例都有(小)内存占用。原始意图是为了改进日志记录,在这种情况下,您通常还会记录每个日志消息的进程ID,以区分来自不同进程的日志源。如果您具有相同的非常细粒度的日志记录,则不希望每次创建可终结对象。 - ckuri
有道理。谢谢分享额外的细节。 - BVernon

23
Process.GetCurrentProcess().Id

或者,由于Process类是IDisposable的,而进程ID在应用程序运行时不会改变,因此您可以使用具有静态属性的辅助类:

public static int ProcessId
{
    get 
    {
        if (_processId == null)
        {
            using(var thisProcess = System.Diagnostics.Process.GetCurrentProcess())
            {
                _processId = thisProcess.Id;
            }
        }
        return _processId.Value;
    }
}
private static int? _processId;

这个应该被标记为答案,因为它强调了GetCurrentProcess()返回一个“进程(Process)”对象,必须进行处理以避免泄漏。 - gio

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