Workaround for the WaitHandle.WaitAll 64 handle limit?

前端 未结 9 1924
孤独总比滥情好
孤独总比滥情好 2020-11-28 04:19

My application spawns loads of different small worker threads via ThreadPool.QueueUserWorkItem which I keep track of via multiple ManualResetEvent

9条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-28 04:49

    protected void WaitAllExt(WaitHandle[] waitHandles)
    {
        //workaround for limitation of WaitHandle.WaitAll by <=64 wait handles
        const int waitAllArrayLimit = 64;
        var prevEndInd = -1;
        while (prevEndInd < waitHandles.Length - 1)
        {
            var stInd = prevEndInd + 1;
            var eInd = stInd + waitAllArrayLimit - 1;
            if (eInd > waitHandles.Length - 1)
            {
                eInd = waitHandles.Length - 1;
            }
            prevEndInd = eInd;
    
            //do wait
            var whSubarray = waitHandles.Skip(stInd).Take(eInd - stInd + 1).ToArray();
            WaitHandle.WaitAll(whSubarray);
        }
    
    }
    

提交回复
热议问题