@@ -36,9 +36,9 @@ public static WorkerScheduler Instance
3636
3737 private readonly long MAX_WORKERS ;
3838 private readonly ConcurrentQueue < AsyncTask > m_taskQueue ;
39- private long m_currentWorkerCount ;
39+ private readonly AtomicInteger m_currentWorkerCount ;
4040 private readonly AsyncTask m_dispatcherTask ;
41- private ManualResetEvent m_waitForAvailableWorker ;
41+ private readonly ManualResetEvent m_waitForAvailableWorker ;
4242
4343 #endregion
4444
@@ -48,6 +48,7 @@ private WorkerScheduler()
4848 m_taskQueue = new ConcurrentQueue < AsyncTask > ( ) ;
4949 m_dispatcherTask = AsyncTaskFactory . From ( new Action ( Dispatcher ) , null ) ;
5050 m_waitForAvailableWorker = new ManualResetEvent ( true ) ;
51+ m_currentWorkerCount = new AtomicInteger ( ) ;
5152 }
5253
5354 public void Schedule ( AsyncTask task )
@@ -67,18 +68,14 @@ private void Dispatcher()
6768 if ( task . IsCompleted || task . IsCancelled || task . HasErrors )
6869 continue ;
6970
70- if ( m_currentWorkerCount >= MAX_WORKERS )
71- m_waitForAvailableWorker . Reset ( ) ;
72-
73- m_waitForAvailableWorker . WaitOne ( ) ;
74-
7571 SetupTask ( task ) ;
7672
77- m_currentWorkerCount ++ ;
78- if ( m_currentWorkerCount >= MAX_WORKERS )
73+ if ( m_currentWorkerCount . Value >= MAX_WORKERS )
7974 m_waitForAvailableWorker . Reset ( ) ;
8075
81- Logger . Debug ( GetType ( ) . Name , $ "Current worker count: { m_currentWorkerCount } ") ;
76+ m_waitForAvailableWorker . WaitOne ( ) ;
77+
78+ Logger . Debug ( GetType ( ) . Name , $ "Current worker count: { m_currentWorkerCount . Increment ( ) } ") ;
8279
8380 task . ConfigureAwait ( false ) . Start ( ) ;
8481 }
@@ -88,8 +85,8 @@ private void SetupTask(AsyncTask task)
8885 {
8986 task . TaskCompleted += ( o , e ) =>
9087 {
91- m_currentWorkerCount -- ;
92- if ( m_currentWorkerCount < MAX_WORKERS )
88+
89+ if ( m_currentWorkerCount . Decrement ( ) < MAX_WORKERS )
9390 m_waitForAvailableWorker . Set ( ) ;
9491
9592 Logger . Debug ( GetType ( ) . Name , $ "Current worker count: { m_currentWorkerCount } ") ;
0 commit comments