Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCT GetThreadWaitChain函数调用为异步导致进程挂起_C#_Interop_Pinvoke - Fatal编程技术网

C# WCT GetThreadWaitChain函数调用为异步导致进程挂起

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

我正试图从我的c#code调用
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调用之前。。。