HikariThreading.ThreadManager.SpawnThreadIfNeeded C# (CSharp) Method

SpawnThreadIfNeeded() private method

Checks if our situation calls for a new thread. If so, spawns one.
private SpawnThreadIfNeeded ( ) : bool
return bool
        internal bool SpawnThreadIfNeeded( )
        {
            // No going over the maximum!
            if ( numThreads >= maxThreads )
                return false;

            // No spawning if it was recent!
            if ( DateTime.Now - lastThreadSpawn < minMsBetweenThreadSpawn )
                return false;

            // Don't make one if there's no work.
            if ( waiting.Count == 0 )
                return false;

            // Alright now we can spawn a thread if the queue length is high enough
            // or if the next thing in the queue has been waiting long enough.
            if ( waiting.Count >= maxQueueLengthBeforeNewThread ||
                DateTime.Now - waitingSpawns.Peek() > maxQueueAgeInMsBeforeNewThread )
            {
                SpawnThread();
                return true;
            }

            return false;
        }

Usage Example

コード例 #1
0
        public void CreatesNewThreadsWhenMoreThanAskedForWorkItems( )
        {
            ThreadManager tm = new ThreadManager(TimeSpan.MinValue, TimeSpan.MaxValue,
                2, TimeSpan.MaxValue);
            int i = -2;
            int cur_threads = tm.NumThreads;
            for ( int j = 0; j < 3; j++ )
                tm.EnqueueTask(new ActionTask(( _ ) => i++, false));
            bool result = tm.SpawnThreadIfNeeded();
            Assert.IsTrue(result, "Did not report that it spawned more threads.");
            Assert.IsTrue(cur_threads < tm.NumThreads, "Did not actually spawn more threads.");

            ThreadManager tm2 = new ThreadManager(TimeSpan.MinValue, TimeSpan.MaxValue,
                6, TimeSpan.MaxValue);
            cur_threads = tm2.NumThreads;
            for ( i = 0; i < 3; i++ )
                tm2.EnqueueTask(new ActionTask(( _ ) => i++, false));
            result = tm2.SpawnThreadIfNeeded();
            Assert.IsFalse(result, "Reported that it spawned more threads before reaching the max queue length.");
            Assert.IsTrue(cur_threads == tm2.NumThreads, "Spawned a new thread before reaching the max queue length.");
            for ( i = 0; i < 3; i++ )
                tm2.EnqueueTask(new ActionTask(( _ ) => i++, false));
            result = tm2.SpawnThreadIfNeeded();
            Assert.IsTrue(result, "Did not report that it spawned more threads.");
            Assert.IsTrue(cur_threads < tm2.NumThreads, "Did not actually spawn more threads.");
        }
All Usage Examples Of HikariThreading.ThreadManager::SpawnThreadIfNeeded