繁体   English   中英

给定线程的 id 或句柄,我如何确定线程的状态?

[英]Given a thread's id or handle, how can I determine the thread's state?

下面的这个函数假装扩展了Thread.Sleep()函数(或 Win32 Sleep / SleepEx ),它只影响调用线程。

在我的suspendFunc lambda 中,我想在调用Thread.Sleep(TimeSpan)之前确保线程是否真的挂起。

我一直在搜索相关的 Win32 线程函数以从线程句柄或线程 id 检索线程的状态,但我没有找到任何类似的东西,我也找不到定义线程状态的结构或枚举(只有托管的)所以我没有找到任何开始这样做的提示。

我怎么能做到这一点?


(注意:P/Invokes 没有在共享代码中提供,我认为它们没有必要理解,只会增加代码大小。)

C#:

public static void SleepThread(int threadId, TimeSpan timespan)
{
    IntPtr hThread = default(IntPtr);
    int win32Err = 0;

    // Returns the previous suspend count for the thread.
    Func<int> suspendFunc = () =>
    {
        int suspendCount = 0;
        Debug.WriteLine("Sleeping...");
        Thread.Sleep(timespan);
        Debug.WriteLine("Resuming thread...");
        suspendCount = ResumeThread(hThread);
        CloseHandle(hThread);
        return suspendCount;
    };

    hThread = OpenThread(ThreadAccessRights.SuspendResume | ThreadAccessRights.Terminate, true, threadId);
    win32Err = Marshal.GetLastWin32Error();

    if ((hThread == IntPtr.Zero)) {
        throw new Win32Exception(win32Err);

    } else {
        Debug.WriteLine("Pausing thread...");
        Task<int> suspendTask = Task.Factory.StartNew<int>(suspendFunc);
        SuspendThread64(hThread);

    }

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================

VB.NET:

Public Shared Sub SleepThread(ByVal threadId As Integer, ByVal timespan As TimeSpan)

    Dim hThread As IntPtr
    Dim win32Err As Integer

    Dim suspendFunc As Func(Of Integer) =
        Function() As Integer ' Returns the previous suspend count for the thread.
            Dim suspendCount As Integer
            Debug.WriteLine("Sleeping...")
            Thread.Sleep(timespan)
            Debug.WriteLine("Resuming thread...")
            suspendCount = ResumeThread(hThread)
            CloseHandle(hThread)
            Return suspendCount
        End Function

    hThread = OpenThread(ThreadAccessRights.SuspendResume Or ThreadAccessRights.Terminate, True, threadId)
    win32Err = Marshal.GetLastWin32Error()

    If (hThread = IntPtr.Zero) Then
        Throw New Win32Exception(win32Err)

    Else
        Debug.WriteLine("Pausing thread...")
        Dim suspendTask As Task(Of Integer) = Task.Factory.StartNew(Of Integer)(suspendFunc)
        SuspendThread64(hThread)

    End If

End Sub

这是我能得到的最接近的。

Function GetThreadState(ProcId As Integer, ThreadId As Integer) As Threading.ThreadState
    For Each Thr As Threading.Thread In Process.GetProcessById(ProcId).Threads
        If Thr.ManagedThreadId = ThreadId Then Return Thr.ThreadState
    Next
    Throw New ArgumentOutOfRangeException("Thread not found.")
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM