Yo creo que él más bien se refiere a suspender la ejecución de un hilo por un tiempo definido como hace el método Thread.Sleep(), pero pudiendo especificar un identificador del hilo.
thread.sleep(1000)
como agrego la id o addres del proceso???
No puedes especificar un thread-id, el método
Thread.Sleep() solamente afecta al hilo desde donde se invocó a dicha función, de hecho las funciones Win32
Sleep y
SleepEx tienen el mismo comportamiento, simplemente NO es posible ...de forma "nativa".
Pero puedes recurrir a las funciones Win32 relacionadas (SuspendThread, ResumeThread), aplicando metodologías asincrónicas.
Te dejo esta solución que he elaborado (lo testeé con el thread-id del UI thread):
Modo de empleo:
Dim threadId As Integer = GetCurrentThreadId().
SleepThread(threadId, TimeSpan.FromSeconds(5))
Código fuente:
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
P/Invoking:
<SuppressUnmanagedCodeSecurity>
<DllImport("kernel32.dll", SetLastError:=False)>
Public Shared Function GetCurrentThreadId(
) As <MarshalAs(UnmanagedType.U4)> Integer
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Public Shared Function OpenThread(
<MarshalAs(UnmanagedType.I4)> ByVal dwDesiredAccess As ThreadAccessRights,
<MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean,
<MarshalAs(UnmanagedType.U4)> ByVal dwThreadId As Integer
) As IntPtr
End Function
<DllImport("kernel32.dll", EntryPoint:="Wow64SuspendThread", SetLastError:=True)>
Public Shared Function SuspendThread32(
<MarshalAs(UnmanagedType.SysInt)> ByVal hThread As IntPtr
) As Integer
End Function
<DllImport("kernel32.dll", EntryPoint:="SuspendThread", SetLastError:=True)>
Public Shared Function SuspendThread64(
<MarshalAs(UnmanagedType.SysInt)> ByVal hThread As IntPtr
) As Integer
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Public Shared Function ResumeThread(
<MarshalAs(UnmanagedType.SysInt)> ByVal hThread As IntPtr
) As Integer
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Public Shared Function CloseHandle(
<MarshalAs(UnmanagedType.SysInt)> ByVal hObject As IntPtr
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
<Flags>
Public Enum ThreadAccessRights As Integer
Terminate = &H1
SuspendResume = &H2
End Enum
PD: Todo esto lo puedes encontrar en mi API ElektroKit (en mi firma, aquí abajo).
Saludos.