private void UpdateTab_Handler(AsyncTabPageEventArgs args)
 {
     if (this.InvokeRequired)
     {
         AsyncUpdateTab updateStatus = new AsyncUpdateTab(UpdateTab_Handler);
         this.Invoke(updateStatus, new object[] { args });
     }
     else
     {
         if (args.RemoveTabs)
         {
             for (int index = tabCtlUploadStatus.TabCount - 1; index > 0; index--)
             {
                 tabCtlUploadStatus.TabPages.RemoveAt(index);
             }
         }
         else if (!args.Show)
         {
             tabCtlUploadStatus.TabPages.Remove(_tabPages[args.CurrentTabIndex]);
         }
         else
         {
             _tabPages[args.CurrentTabIndex].Text = args.DisplayText;
             tabCtlUploadStatus.TabPages.Add(_tabPages[args.CurrentTabIndex]);
         }
     }
 }
        public void ThreadManager()
        {
            AsyncTabPageEventArgs args = new AsyncTabPageEventArgs(0, "");

            while (true)
            {
                for (int index = 0; index < _ta.Count(); index++)
                {
                    args.CurrentTabIndex = index;
                    if (_ta[index] != null)
                    {
                        if (_ta[index].ThreadState == System.Threading.ThreadState.Stopped)
                        {
                            BCPCommandCtrl par = (BCPCommandCtrl)_tabPages[index].Controls[0];
                            if (par.CurrentJobInfo.JobStatus == CommandStatus.Success || par.CurrentJobInfo.JobStatus == CommandStatus.Skip)
                            {
                                args.Show = false;
                                UpdateTabHandler(args);
                                _ta[index] = null;
                            }
                        }
                    }

                    args.Show = true;

                    if (_ta[index] == null)
                    {
                        BCPJobInfo jobInfo = GetNextWaitingJob();
                        if (jobInfo != null)
                        {
                            args.DisplayText           = jobInfo.TableName;
                            args.CurrentTabIndex       = index;
                            jobInfo.CurrentThreadIndex = index;

                            UpdateTabHandler(args);

                            BCPCommandCtrl par = (BCPCommandCtrl)_tabPages[index].Controls[0];
                            par.CurrentJobInfo = jobInfo;

                            ThreadStart ts = new System.Threading.ThreadStart(delegate() { StartUpload(par); });
                            _ta[index] = new Thread(ts);
                            _ta[index].CurrentCulture   = CultureInfo.CurrentCulture;
                            _ta[index].CurrentUICulture = CultureInfo.CurrentUICulture;
                            _ta[index].Start();
                        }
                    }
                }
                Thread.Sleep(500);    // Sleep for awhile and then look for more data to process
                if (AsyncProcessingStatus.FinishedAddingJobs && BCPJobsDone())
                {
                    break;
                }
            }
            args.RemoveTabs = true;
            UpdateTabHandler(args);
            AsyncProcessingStatus.FinishedProcessingJobs = true;
        }
        public static void ThreadManager()
        {
            AsyncTabPageEventArgs args = new AsyncTabPageEventArgs(0, "");

            while (true)
            {
                for (int index = 0; index < _ta.Count(); index++)
                {
                    args.CurrentTabIndex = index;

                    if (_ta[index] == null || _ta[index].ThreadState == ThreadState.Stopped)
                    {
                        BCPJobInfo jobInfo = GetNextWaitingJob();
                        if (jobInfo != null)
                        {
                            args.DisplayText           = jobInfo.TableName;
                            args.CurrentTabIndex       = index;
                            jobInfo.CurrentThreadIndex = index;

                            BCPCommandCtrl bcc = new BCPCommandCtrl();
                            bcc.UpdateBCPJobStatus    = new AsyncBCPJobUpdateStatus(BCPAsyncUpdateResultsHandler);
                            bcc.CurrentJobInfo        = jobInfo;
                            _bcpWorkingCommand[index] = bcc;

                            ThreadStart ts = new System.Threading.ThreadStart(delegate() { StartUpload(bcc); });
                            _ta[index] = new Thread(ts);
                            _ta[index].CurrentCulture   = CultureInfo.CurrentCulture;
                            _ta[index].CurrentUICulture = CultureInfo.CurrentUICulture;
                            _ta[index].Start();
                        }
                    }
                }
                Thread.Sleep(500);    // Sleep for awhile and then look for more data to process
                if (AsyncProcessingStatus.FinishedAddingJobs && BCPJobsDone())
                {
                    break;
                }
            }

            BCPAsyncUploadProcessDone();
            AsyncProcessingStatus.FinishedProcessingJobs = true;
        }