Beispiel #1
0
        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()
Beispiel #2
0
        }//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()