C# WCT GetThreadWaitChain函数调用为异步导致进程挂起
我正试图从我的c#code调用C# WCT GetThreadWaitChain函数调用为异步导致进程挂起,c#,interop,pinvoke,C#,Interop,Pinvoke,我正试图从我的c#code调用Advapi32GetThreadWaitChain(WCT)函数,我以前也曾在类似问题上遇到过困难: 但是,现在我尝试将此调用作为带回调的异步调用,如下所述: 这是我的结论: internal void CollectWaitAsyncInformation(ClrThread thread) { //Currenlty not working var handle = Advapi32.OpenThreadWaitChainSessio
Advapi32
GetThreadWaitChain
(WCT)函数,我以前也曾在类似问题上遇到过困难:
但是,现在我尝试将此调用作为带回调的异步调用,如下所述:
这是我的结论:
internal void CollectWaitAsyncInformation(ClrThread thread)
{
//Currenlty not working
var handle = Advapi32.OpenThreadWaitChainSession(WCT_SESSION_OPEN_FLAGS.WCT_ASYNC_OPEN_FLAG, AppCallback);
uint threadID = thread.OSThreadId;
WAITCHAIN_NODE_INFO[] NodeInfoArray = new WAITCHAIN_NODE_INFO[WctApiConst.WCT_MAX_NODE_COUNT];
int isCycle = 0;
int Count = WctApiConst.WCT_MAX_NODE_COUNT;
_eventHandler = Kernel32.CreateEvent(IntPtr.Zero, true, true, "MyEvent");
//This is where the applciation hangs
bool waitChainResult = Advapi32.GetThreadWaitChain(handle,
_eventHandler, 0 ,
threadID, ref Count, NodeInfoArray, out isCycle);
CheckCount(ref Count);
if (!waitChainResult)
{
var lastErrorCode = WinApi.Advapi32.GetLastError();
if (lastErrorCode == (uint)SYSTEM_ERROR_CODES.ERROR_IO_PENDING)
{
// Wait for callback to run...
WinApi.Kernel32.WaitForSingleObject(_eventHandler, int.MaxValue);
}
Kernel32.WaitForSingleObject(_eventHandler, uint.MaxValue);
}
}
链接:
调用Advapi32.GetThreadWaitChain
函数时,进程挂起,没有任何错误
上次的问题是WAITCHAIN\u NODE\u INFO
struct布局,但是这里我使用的是同一个结构,所以我不知道这是否是一个问题,但是如果我通过IntPtr.Zero
而不是NodeInfo
数组,结果是false,但是GetLastError
返回0
任何帮助都将不胜感激:)
以下是我整个GitHub项目的链接:
不应调用winapi GetLastError(),而应将函数导入标记为
SetLastError=true
。如果要获取错误信息,请抛出Win32异常。好的,我会更改它,但是挂起发生在GetLastError调用之前。。。