private void _doUpdateOpThreadWrapper(Object doUpdateParamsObj) { CswNbtSchemaUpdateThreadParams ThreadParams = (CswNbtSchemaUpdateThreadParams)doUpdateParamsObj; try { ThreadParams.UpdateSucceeded = _doUpdateOp(ThreadParams.CurrentAccessId, ThreadParams.CswNbtResources, ThreadParams.ResourcesInitHandler, ThreadParams.CswConsoleOutput, true, _continueExecutingScriptsOnError()); } catch (Exception Exception) { ThreadParams.UpdateSucceeded = false; ThreadParams.CswConsoleOutput.write(_Separator_NuLine); ThreadParams.CswConsoleOutput.write("Error updating schema " + ThreadParams.CurrentAccessId + ": " + Exception.Message + ": " + Exception.StackTrace, ForceWrite: true); } }//_doUpdateOpThreadWrapper()
}//process() private bool _runConcurrentSchemaUpdates(StringCollection AccessIds, Int32 MaxConcurrentSchemata) { bool ReturnVal = true; List <Thread> RunningThreads = new List <Thread>(); Queue <string> AccessIdQueue = new Queue <string>(); Dictionary <int, CswNbtSchemaUpdateThreadParams> ThreadIdsToParams = new Dictionary <int, CswNbtSchemaUpdateThreadParams>(); //Queue<string> foreach (string CurrentAccessId in AccessIds) { AccessIdQueue.Enqueue(CurrentAccessId); } //populate stack of Access Id's to process do { if ((RunningThreads.Count < MaxConcurrentSchemata) && (AccessIdQueue.Count > 0)) { string AccessIdToRunConcurrently = AccessIdQueue.Dequeue(); // private void _doUpdateOp( string CurrentAccessId, CswNbtResources CswNbtResources, CswConsoleOutput CswConsoleOutput ) CswNbtSchemaUpdateThreadParams ThreadParams = new CswNbtSchemaUpdateThreadParams(); _makeResources(AccessIdToRunConcurrently, ref ThreadParams.CswNbtResources); ThreadParams.CurrentAccessId = AccessIdToRunConcurrently; ThreadParams.ResourcesInitHandler = _makeResources; ThreadParams.CswConsoleOutput = new CswConsoleOutput(ThreadParams.CswNbtResources.CswLogger, ThreadParams.CswNbtResources.AccessId); ThreadParams.CswConsoleOutput.CollectStatusMessages = true; ThreadParams.CswConsoleOutput.ReportAccessIds = false; // ThreadParams.DisplayConcurrentProgressMessages = false; if (_UserArgs.ContainsKey(_ArgKey.DisplayConcurrentProgress)) { ThreadParams.CswConsoleOutput.CollectStatusMessages = false; ThreadParams.CswConsoleOutput.ReportAccessIds = true; } else { ThreadParams.CswConsoleOutput.CollectStatusMessages = true; ThreadParams.CswConsoleOutput.ReportAccessIds = false; } Thread CurrentThread = new Thread(new ParameterizedThreadStart(_doUpdateOpThreadWrapper)); RunningThreads.Add(CurrentThread); ThreadParams.CswConsoleOutput.write(DateTime.Now.ToString() + ": Initiating concurrent schema update on AccessId " + AccessIdToRunConcurrently + _Separator_NuLine, ForceWrite: true); ThreadIdsToParams.Add(CurrentThread.ManagedThreadId, ThreadParams); CurrentThread.Start(ThreadParams); } else { bool ThreadCompleted = false; Int32 CurrentThreadIdx = 0; while ((false == ThreadCompleted) && (CurrentThreadIdx < RunningThreads.Count)) { Thread.Sleep(500); Thread CurrentThread = RunningThreads[CurrentThreadIdx]; if (false == CurrentThread.IsAlive) { if (ThreadIdsToParams.ContainsKey(CurrentThread.ManagedThreadId)) { CswNbtSchemaUpdateThreadParams RemovedThreadParams = ThreadIdsToParams[CurrentThread.ManagedThreadId]; RemovedThreadParams.CswConsoleOutput.write(DateTime.Now.ToString() + ": Completed schema update on AccessId " + RemovedThreadParams.CurrentAccessId + _Separator_NuLine, ForceWrite: true); ReturnVal = ReturnVal && RemovedThreadParams.UpdateSucceeded; } ThreadIdsToParams.Remove(CurrentThread.ManagedThreadId); RunningThreads.Remove(CurrentThread); ThreadCompleted = true; } CurrentThreadIdx++; } } //if else there are more accessids to process and we're under the concurrency limit } while((AccessIdQueue.Count > 0) || (RunningThreads.Count > 0)); return(ReturnVal); }//_runConcurrentSchemaUpdates()