| File: System\Diagnostics\ProcessThread.cs | Web Access |
| Project: src\runtime\src\libraries\System.Diagnostics.Process\src\System.Diagnostics.Process.csproj (System.Diagnostics.Process) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.Runtime.Versioning; namespace System.Diagnostics { /// <devdoc> /// <para> /// Represents a Win32 thread. This can be used to obtain /// information about the thread, such as it's performance characteristics. This is /// returned from the System.Diagnostics.Process.ProcessThread property of the System.Diagnostics.Process component. /// </para> /// </devdoc> [Designer("System.Diagnostics.Design.ProcessThreadDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public partial class ProcessThread : Component { private readonly bool _isRemoteMachine; private readonly int _processId; private readonly ThreadInfo _threadInfo; private bool? _priorityBoostEnabled; private ThreadPriorityLevel? _priorityLevel; /// <devdoc> /// Internal constructor. /// </devdoc> /// <internalonly/> internal ProcessThread(bool isRemoteMachine, int processId, ThreadInfo threadInfo) { _isRemoteMachine = isRemoteMachine; _processId = processId; _threadInfo = threadInfo; } /// <devdoc> /// Returns the base priority of the thread which is computed by combining the /// process priority class with the priority level of the associated thread. /// </devdoc> public int BasePriority { get { return _threadInfo._basePriority; } } /// <devdoc> /// The current priority indicates the actual priority of the associated thread, /// which may deviate from the base priority based on how the OS is currently /// scheduling the thread. /// </devdoc> public int CurrentPriority { get { return _threadInfo._currentPriority; } } /// <devdoc> /// Returns the unique identifier for the associated thread. /// </devdoc> public int Id { get { return unchecked((int)_threadInfo._threadId); } } /// <devdoc> /// Returns or sets whether this thread would like a priority boost if the user interacts /// with user interface associated with this thread. /// </devdoc> public bool PriorityBoostEnabled { get { if (!_priorityBoostEnabled.HasValue) { _priorityBoostEnabled = PriorityBoostEnabledCore; } return _priorityBoostEnabled.Value; } set { PriorityBoostEnabledCore = value; _priorityBoostEnabled = value; } } /// <devdoc> /// Returns or sets the priority level of the associated thread. The priority level is /// not an absolute level, but instead contributes to the actual thread priority by /// considering the priority class of the process. /// </devdoc> public ThreadPriorityLevel PriorityLevel { [SupportedOSPlatform("windows")] [SupportedOSPlatform("linux")] [SupportedOSPlatform("freebsd")] get { if (!_priorityLevel.HasValue) { _priorityLevel = PriorityLevelCore; } return _priorityLevel.Value; } [SupportedOSPlatform("windows")] set { PriorityLevelCore = value; _priorityLevel = value; } } /// <devdoc> /// Returns the memory address of the function that was called when the associated /// thread was started. /// </devdoc> public unsafe IntPtr StartAddress { get { return (IntPtr)_threadInfo._startAddress; } } /// <devdoc> /// Returns the current state of the associated thread, e.g. is it running, waiting, etc. /// </devdoc> public ThreadState ThreadState { get { return _threadInfo._threadState; } } /// <devdoc> /// Returns the reason the associated thread is waiting, if any. /// </devdoc> public ThreadWaitReason WaitReason { get { if (_threadInfo._threadState != ThreadState.Wait) { throw new InvalidOperationException(SR.WaitReasonUnavailable); } return _threadInfo._threadWaitReason; } } /// <summary>Returns the time the associated thread was started.</summary> [SupportedOSPlatform("windows")] [SupportedOSPlatform("linux")] public DateTime StartTime { get => GetStartTime(); } /// <devdoc> /// Helper to check preconditions for property access. /// </devdoc> private void EnsureState(State state) { if (((state & State.IsLocal) != (State)0) && _isRemoteMachine) { throw new NotSupportedException(SR.NotSupportedRemoteThread); } } /// <summary> /// Preconditions for accessing properties. /// </summary> /// <internalonly/> private enum State { IsLocal = 0x2 } } }