public UserCmdParallelExecuteManagerSystem(IGameModule gameModule,
                                                   IUserCmdExecuteSystemHandler handler,
                                                   IGameStateProcessorFactory gameStateProcessorFactory,
                                                   int threadCount)
        {
            _systems   = new List <IUserCmdExecuteSystem>();
            _taskInfos = new List <TaskInfo>();
            _systems.Add(new UserCmdPreExecuteSystem(gameStateProcessorFactory));
            _systems.AddRange(gameModule.UserCmdExecuteSystems);
            _systems.Add(new UserCmdPostExecuteSystem());

            _handler = handler;
            int count = _systems.Count;

            _systemsPool = new List <IUserCmdExecuteSystem> [threadCount];
            InitTask(threadCount, count);
            _mainThread = new WorkThread("Main", _systems);
            WorkThread[] slaveThreads = new WorkThread[threadCount];
            for (var i = 0; i < threadCount; i++)
            {
                slaveThreads[i] = new WorkThread("Slave", _systemsPool[i]);
            }

            _taskDisparcher = new TaskDispatcher(threadCount, _mainThread, slaveThreads, _taskInfos);

            _mainThread.Name = "MainThread";
            _mainThread.SetTaskDisparcher(_taskDisparcher);
            for (var i = 0; i < threadCount; i++)
            {
                slaveThreads[i].SetTaskDisparcher(_taskDisparcher);
                slaveThreads[i].Name = string.Format("SlaveThreads:{0}", i);
            }

            _taskDisparcher.Start();
        }
Пример #2
0
    void Update()
    {
        if (m_operationDelay > 0.0f)
        {
            m_operationDelay -= Time.fixedDeltaTime;
            return;
        }

        if (m_operations.Count > 0)
        {
            EOperation op = m_operations.Dequeue();
            m_operationDelay = DEFAULT_OPERATION_DELAY;

            m_onGoingOperations.Add(new WorkThread(op, DEFAULT_OPERATION_TIMEOUT));
        }

        for (int i = m_onGoingOperations.Count - 1; i >= 0; --i)
        {
            WorkThread work = m_onGoingOperations[i];
            if (work.state == EWorkingState.DONE)
            {
                m_onGoingOperations.RemoveAt(i);
            }
            else
            {
                CommitOperation(work);
            }
        }
    }
Пример #3
0
        static void Main(string[] args)
        {
            //得到这两个月的OA数据
            var t = DateTime.Today;

            t = t.AddDays(-40);
            oahelper.GetData(t);



            var delcount = DB.Context.DeleteAll <Dos.Model.original>();

            log._logger.Info($"清楚考勤原有记录{delcount}条");

            var Device = new WorkThread("192.168.4.31", 4370);//You can custom the LAN Segment.

            Device.Connect();
            Device.GetUser();

            Device.GetLog();

            Device.DisConnect();

            Device = new WorkThread("192.168.4.32", 4370); //You can custom the LAN Segment.

            Device.Connect();
            Device.GetUser();

            Device.GetLog();

            Device.DisConnect();
        }
Пример #4
0
    private void CommitOperation(WorkThread work)
    {
        switch (work.op)
        {
        case EOperation.INIT:
            OpInit(work);
            break;

        case EOperation.LOG_IN:
            OpLogIn(work);
            break;

        case EOperation.INVITE_FRIENDS:
            OpInviteFriends(work);
            break;

        case EOperation.MY_INFO:
            OpMyInfo(work);
            break;

        case EOperation.POST_TO_WALL:
            OpPostToWall(work);
            break;
        }

        if (work.state == EWorkingState.ONGOING)
        {
            work.timeout -= Time.fixedDeltaTime;
            if (work.timeout <= 0.0f)
            {
                work.state = EWorkingState.DONE;
            }
        }
    }
Пример #5
0
    void OpInviteFriends(WorkThread work)
    {
        if (!IsLoggedIn)
        {
            work.state = EWorkingState.DONE;
            return;
        }

        if (work.state == EWorkingState.START)
        {
            work.state = EWorkingState.ONGOING;

            FB.AppRequest(
                to: null,
                filters: "",
                excludeIds: null,
                message: "Castle Attack is awesome! Check it out!",
                title: "Play Castle Attack with me!",
                callback: (result) =>
            {
                work.state = EWorkingState.DONE;
            }
                );
        }
    }
Пример #6
0
    void OpMyInfo(WorkThread work)
    {
        if (!IsLoggedIn)
        {
            work.state = EWorkingState.DONE;
            return;
        }

        if (work.state == EWorkingState.START)
        {
            work.state = EWorkingState.ONGOING;

            FB.API("/me?fields=name", Facebook.HttpMethod.GET, (result) =>
            {
                Dictionary <string, object> pairs = Json.Deserialize(result.Text) as Dictionary <string, object>;
                object nameH;
                if (pairs.TryGetValue("name", out nameH))
                {
                    m_facebookName = (string)nameH;
                }

                Debug.Log("My id: " + FB.UserId + "\nMy name: " + m_facebookName);
                work.state = EWorkingState.DONE;
            });
        }
    }
Пример #7
0
 public static void asyncExecInit()
 {
     if (bgWorker == null)
     {
         bgWorker = new WorkThread();
     }
 }
Пример #8
0
    void OpLogIn(WorkThread work)
    {
        if (!IsFunctional)
        {
            work.state = EWorkingState.DONE;
            return;
        }

        if (IsLoggedIn)
        {
            work.state = EWorkingState.DONE;

            Operate(EOperation.MY_INFO);
            return;
        }

        if (work.state == EWorkingState.START)
        {
            work.state = EWorkingState.ONGOING;

            FB.Login("", (result) =>
            {
                if (FB.IsLoggedIn)
                {
                    Operate(EOperation.MY_INFO);
                }
                work.state = EWorkingState.DONE;
            });
        }
    }
Пример #9
0
 public static void AddWorker(ThreadManager threadManager)
 {
     Interlocked.Increment(ref threadManager.activeThreads);
     var worker = new WorkThread(threadManager);
     var thread = new Thread(worker.Loop);
     thread.SetApartmentState(ApartmentState.STA);
     thread.Start();
 }
Пример #10
0
        public static void AddWorker(ThreadManager threadManager)
        {
            Interlocked.Increment(ref threadManager.activeThreads);
            var worker = new WorkThread(threadManager);
            var thread = new Thread(worker.Loop);

            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }
Пример #11
0
        private Thread DeleteThread()
        {
            int        i      = workers.Count - 1;
            WorkThread worker = (WorkThread)workers[i];

            worker.Stop();
            workers.RemoveAt(i);

            return(worker.Thread);
        }
Пример #12
0
 protected virtual void Dispose(bool disposing)
 {
     ReleaseUnmanagedResources();
     if (disposing)
     {
         if (WorkBytesEvent != null)
         {
             WorkBytesEvent.Dispose();
         }
         if (OrigBytesEvent != null)
         {
             OrigBytesEvent.Dispose();
         }
         if (DelayBytesEvent != null)
         {
             DelayBytesEvent.Dispose();
         }
         if (WorkEnergyEvent != null)
         {
             WorkEnergyEvent.Dispose();
         }
         if (FreqWaveEvent != null)
         {
             FreqWaveEvent.Dispose();
         }
         if (OrigThread != null)
         {
             OrigThread.Abort();
             if (OrigThread.ThreadState != ThreadState.Aborted)
             {
                 Thread.Sleep(100);
             }
         }
         if (DelayThread != null)
         {
             DelayThread.Abort();
         }
         if (WorkThread != null)
         {
             WorkThread.Abort();
             if (WorkThread.ThreadState != ThreadState.Aborted)
             {
                 Thread.Sleep(100);
             }
         }
         if (EnergyThread != null)
         {
             EnergyThread.Abort();
         }
         if (FreqThread != null)
         {
             FreqThread.Abort();
         }
     }
 }
Пример #13
0
        private void GetItems()
        {
            ArrayList itemarr = new ArrayList();
            ArrayList arr = null;
            StringBuilder sb = new StringBuilder();
            try
            {
                arr = MemCachedManager.GetStats(serverList, MemCachedManager.Stats.Items, null);
                if (arr.Count == 0)
                {
                    this.frm.备份ToolStripMenuItem1.Enabled = true;
                    this.frm.还原ToolStripMenuItem.Enabled = true;
                    WriteState("没有找到数据!");
                    return;
                }
                if (arr == null)
                {
                    WriteState("连接服务器异常!");
                    return;
                }
            }
            catch (Exception ex)
            {
                WriteState(ex.Message.ToString());
            }

            foreach (string a in arr)
            {
                string[] tmparr = a.Split(':');
                if (tmparr.Length > 1)
                {
                    int item_id = 0;
                    int.TryParse(tmparr[1], out item_id);

                    bool find = false;
                    foreach (int item in itemarr)
                    {
                        if (item == item_id)
                            find = true;
                    }
                    if (!find && item_id > 0 && item_id != 11211)
                        itemarr.Add(item_id);
                }
            }
            WriteState("获取Item 成功" + itemarr.Count + "个Item!");
            foreach (int item in itemarr)
            {
                WorkThread wt = null;
                wt = new WorkThread(item, new Help(0, 1, 0, true));
                wt.frm = this;
                wt.arrayList = serverList;
                dic.Add(item, wt);
                wt.Run();
            }
        }
Пример #14
0
        private void CreateThread()
        {
            WorkThread worker = new WorkThread(this);
            workers.Add(worker);

            Thread thread = new Thread(new ThreadStart(worker.Start));
            thread.Name = "WT #" + workers.Count;
            thread.IsBackground = true;

            worker.Thread = thread;
            thread.Start();
        }
Пример #15
0
        private void workThreadSuccessCallback(WorkThread input)
        {
            this.workThreads.Remove(input);

            this.result += input.result;

            if (this.workThreads.Count == 0)
            {
                formShowResult method = new formShowResult(this.formShowResultImpl);
                this.Invoke(method);
            }
        }
Пример #16
0
    // Operations
    void OpInit(WorkThread work)
    {
        if (work.state == EWorkingState.START)
        {
            work.state = EWorkingState.ONGOING;

            FB.Init(() =>
            {
                m_isFunctional = true;
                work.state     = EWorkingState.DONE;
            });
        }
    }
Пример #17
0
 /// <summary>
 ///     Disables the updater.
 /// </summary>
 public void Disable()
 {
     IsEnabled = false;
     if (WorkThread == null)
     {
         return;
     }
     if (WorkThread.ThreadState == ThreadState.Running)
     {
         WorkThread.Abort();
     }
     WorkThread = null;
 }
Пример #18
0
        private void button1_Click(object sender, EventArgs e)
        {
            this.result = 0;
            this.workThreads.Clear();

            for (int i = 1; i <= 4; i++)
            {
                WorkThread threadImpl = new WorkThread(new Action <int>(this.workThreadCallback), new Action <WorkThread>(this.workThreadSuccessCallback));
                threadImpl.thread.Start();

                this.workThreads.Add(threadImpl);
            }
        }
Пример #19
0
        /// <summary>
        ///     开始工作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="parameters"></param>
        private void WorkStart(object sender, EventArgs e, object[] parameters)
        {
            var page     = (int)parameters[0]; //总页数
            var pageSize = (int)parameters[1]; //每页大小

            for (int i = 0; i < page; i++)
            {
                var thread = new WorkThread(new object[] { i *pageSize, pageSize });
                thread.WorkThread_Completed += WorkThread_Completed;
                thread.WorkThread_DoWork    += WorkThread_DoWork; //设定工作内容
                thread.Start();                                   //启动工作线程
                _worker.Threads.Add(thread);
            }
        }
 private void Awake()
 {
     Instence              = this;
     cache_int             = new ArrayCache <int>();
     cache_v2              = new ArrayCache <Vector2>();
     cache_v3              = new ArrayCache <Vector3>();
     cache_chunk           = new Stack <Chunk>();
     chunk_map             = new Dictionary <long, Chunk>();
     remove_queue          = new Queue <Chunk>();
     add_queue             = new Queue <Chunk>();
     m_TotalMeshSegmentNum = MeshPieceNum * MeshPieceSegment;
     m_MeshSegmentSize     = ChunkSize / m_TotalMeshSegmentNum;
     m_thread_work         = new WorkThread();
     AddChunk(0, 0);
 }
Пример #21
0
        public DataFlowBuilder BuildConsumers()
        {
            for (int i = 0; i < _consumerThreadsCount; i++)
            {
                var consumer   = DataFlowFactory.CreateConsumer(_executionContext, _arguments.DataFlow);
                var workThread = new WorkThread(consumer.StartConsuming);
                workThread.CommandException += (sender, args) =>
                {
                    _logger.Fatal(((DataProcessingExceptionEventArgs)args).Exception);
                    Console.WriteLine("\r\nAn exception occured while processing data. Check logs for details");
                    _executionContext.StopExecution();
                };

                _threads.Add(workThread);
            }

            return(this);
        }
 private void Free(IList indexs)
 {
     if (indexs == null)
     {
         throw new ArgumentNullException("indexs");
     }
     if (indexs.Count != 0)
     {
         for (int i = 0; i < indexs.Count; i++)
         {
             int state = (int)indexs[i];
             if (state != -1)
             {
                 WorkThread.QueueItem(new WaitCallback(this.FreeItem), state);
             }
         }
     }
 }
Пример #23
0
        static void Main(string[] args)
        {
            int iWorkCount = 254;//the ultimate count of devices in LAN
            WorkThread[] Device=new WorkThread[iWorkCount];
            bool bSetMaxThread = ThreadPool.SetMaxThreads(iWorkCount, 500);
            if (!bSetMaxThread)
            {
                Console.WriteLine("Setting max threads of the threadpool failed!");
            }
            for (int i = 0; i < iWorkCount; i++)
            {
                Device[i] = new WorkThread("192.168.0." + ((int)(1 + i)).ToString(), 4370);//You can custom the LAN Segment.
                ThreadPool.QueueUserWorkItem(Device[i].ThreadPoolCallBack);//Put the method into the queue to implement.
            }
            Console.WriteLine("Pls Wait for a moment......Current Time:" + DateTime.Now.ToLongTimeString());

            //Wait for keyboard input before exiting the program. In order to see the debugging output. If there is no this sentence, the command window will flash by.
            Console.ReadKey();
        }
Пример #24
0
		internal void CallBack(SyncContext syncContext, WorkThread workThread)
		{
			this.workThread = workThread;

			try
			{
				syncContext.IncrementCallbackCount();

				this.callback(state);
			}
			finally
			{
				syncContext.DecrementCallbackCount();

				// 任意一个工作项执行完后将 RunContext.Current、SecurityContext.Current 重设,确保后续工作项不误用前一工作项的相关上下文
				// 此处的调用与 IOCInstanceProvider.GetInstance 中的调用是成对的
				RunContext.ResetCurrent();
				SecurityContext.ResetCurrent();

				this.waitHandle.Set();
			}
		}
Пример #25
0
        public DataFlowBuilder BuildProducer()
        {
            var producer = DataFlowFactory.CreateProducer(_executionContext, _arguments.DataFlow);

            var workThread = new WorkThread(producer.StartProducing);

            workThread.CommandException += (sender, args) =>
            {
                _logger.Fatal(((DataProcessingExceptionEventArgs)args).Exception);
                Console.WriteLine("\r\nAn exception occured while reading data. Check logs for details");
                _executionContext.StopExecution();
            };

            producer.ProgressChanged += (sender, e) =>
            {
                Console.Write("\rCompleted " + ((ProgressChangedEventArgs)e).PercentageCompleted + "%");
            };

            _threads.Add(workThread);

            return(this);
        }
Пример #26
0
        private void CheckItem(object state)
        {
            if (state == null)
            {
                throw new ArgumentNullException("state");
            }
            string[]           files  = null;
            FileInfo           info   = null;
            ISupportFileCached cached = null;

            cached = state as ISupportFileCached;
            if (cached != null)
            {
                files = cached.Files;
                if (files.Length != 0)
                {
                    for (int i = 0; i < files.Length; i++)
                    {
                        if (File.Exists(files[i]))
                        {
                            try
                            {
                                info = new FileInfo(files[i]);
                                if (info.LastWriteTime > this._dateTimeLastChecked)
                                {
                                    WorkThread.QueueItem(new WaitCallback(cached.FileReload), files[i]);
                                }
                            }
                            catch
                            {
                            }
                        }
                    }
                }
            }
        }
Пример #27
0
    void OpPostToWall(WorkThread work)
    {
        if (!IsLoggedIn)
        {
            work.state = EWorkingState.DONE;
            return;
        }

        if (work.state == EWorkingState.START)
        {
            work.state = EWorkingState.ONGOING;

            FB.Feed(
                linkCaption: "I scored " + PlayerStash.Instance.CurrentScore + " in Castle Attack! Can you beat it?",
                picture: "http://kinoastudios.com/CastleDefender/logolarge.jpg",
                linkName: "Beat me at Castle Attack!",
                link: "http://www.facebook.com/pages/Kinoastudios/397813703654774",
                callback: (result) =>
            {
                work.state = EWorkingState.DONE;
            }
                );
        }
    }
Пример #28
0
	void OpInviteFriends(WorkThread work)
	{
		if( !IsLoggedIn )
		{
			work.state = EWorkingState.DONE;
			return;
		}
		
		if( work.state == EWorkingState.START )
		{
			work.state = EWorkingState.ONGOING;
			
			FB.AppRequest(
				to: null,
				filters : "",
				excludeIds : null,
				message: "Castle Attack is awesome! Check it out!",
				title: "Play Castle Attack with me!",
				callback: (result) =>
				{
					work.state = EWorkingState.DONE;
				}
				); 
		}			
	}
Пример #29
0
		private WorkThread StartThread()
		{
			WorkThread workThread = new WorkThread(this);

			this.workThreads[workThread.ManagedThreadId] = workThread;

			workThread.Start();

			return workThread;
		}
Пример #30
0
 private void StartThread()
 {
     thread = new WorkThread(ThreadWork);
       thread.Start();
 }
Пример #31
0
		internal WorkItem GetNextWorkItem(WorkThread workThread)
		{
			// 贪婪算法,只要队列中存在请求,就返回以执行,跳过 semaphore.WaitOne 的等待过程,这可确保尽可能快的把所有请求处理完
			if (this.workItems.Count > 0)
			{
				lock (this.sync4workItems)
				{
					if (this.workItems.Count > 0)
					{
						return this.workItems.Dequeue();
					}
				}
			}

			// 收到信号但未找到可以执行的工作项(信号相关的工作项已被别的线程执行),
			// 如果空闲线程数超过 minPoolSize,则说明线程已经多余,杀掉此线程
			if (this.WorkThreadsCount - this.callBackCount > this.MinPoolSize)
			{
				lock (this.sync4workThreads)
				{
					this.StopThread(workThread);
				}

				return null;
			}

			this.semaphore.WaitOne(15000);

			return null;
		}
Пример #32
0
		private void StopThread(WorkThread workThread)
		{
			workThread.Stop();

			this.workThreads.Remove(workThread.ManagedThreadId);
		}
Пример #33
0
		internal void OnWorkThreadAborted(WorkThread workThread)
		{
			lock (this.sync4workThreads)
			{
				this.StopThread(workThread);
			}
		}
Пример #34
0
	private void CommitOperation(WorkThread work)
	{
		switch( work.op )
		{
		case EOperation.INIT:
			OpInit(work);				
			break;
			
		case EOperation.LOG_IN:
			OpLogIn(work);		
			break;
			
		case EOperation.INVITE_FRIENDS:
			OpInviteFriends(work);
			break;
			
		case EOperation.MY_INFO:
			OpMyInfo(work);
			break;
			
		case EOperation.POST_TO_WALL:
			OpPostToWall(work);
			break;
		}			
		
		if( work.state == EWorkingState.ONGOING )
		{
			work.timeout -= Time.fixedDeltaTime;
			if( work.timeout <= 0.0f )
			{
				work.state = EWorkingState.DONE;
			}
		}
	}
Пример #35
0
	// Operations
	void OpInit(WorkThread work)
	{
		if( work.state == EWorkingState.START )
		{
			work.state = EWorkingState.ONGOING;
			
			FB.Init(() => 
			{ 
				m_isFunctional = true;
				work.state = EWorkingState.DONE;
			});			
		}
	}
Пример #36
0
 public void Start()
 {
     if (!active)
       {
     InternalStart();
     thread = new WorkThread(DoWork);
     thread.Start();
     active = true;
       }
 }
Пример #37
0
	void OpLogIn(WorkThread work)
	{
		if( !IsFunctional )
		{
			work.state = EWorkingState.DONE;
			return;
		}
		
		if( IsLoggedIn )
		{			
			work.state = EWorkingState.DONE;
			
			Operate(EOperation.MY_INFO);
			return;
		}		
		
		if( work.state == EWorkingState.START )
		{
			work.state = EWorkingState.ONGOING;
			
			FB.Login("", (result) => 
			{
				if( FB.IsLoggedIn )
				{
					Operate(EOperation.MY_INFO);
				}
				work.state = EWorkingState.DONE;
			});		
		}
	}
Пример #38
0
	void OpPostToWall(WorkThread work)
	{
		if( !IsLoggedIn )
		{
			work.state = EWorkingState.DONE;
			return;
		}
		
		if( work.state == EWorkingState.START )
		{
			work.state = EWorkingState.ONGOING;
			
			FB.Feed(                                                                                                                 
			        linkCaption: "I scored " + PlayerStash.Instance.CurrentScore + " in Castle Attack! Can you beat it?",               
			        picture: "http://kinoastudios.com/CastleDefender/logolarge.jpg",
			        linkName: "Beat me at Castle Attack!",                                                                 
			        link: "http://www.facebook.com/pages/Kinoastudios/397813703654774",
			        callback: (result) =>
			        {
						work.state = EWorkingState.DONE;
			        }
			        );  
		}			
	}
Пример #39
0
	void OpMyInfo(WorkThread work)
	{
		if( !IsLoggedIn )
		{
			work.state = EWorkingState.DONE;
			return;
		}
		
		if( work.state == EWorkingState.START )
		{
			work.state = EWorkingState.ONGOING;
			
			FB.API("/me?fields=name", Facebook.HttpMethod.GET, (result) =>
			{
				Dictionary<string, object> pairs = Json.Deserialize(result.Text) as Dictionary<string, object>;
				object nameH;
				if( pairs.TryGetValue("name", out nameH) )
				{
					m_facebookName = (string)nameH;
				}
				
				Debug.Log("My id: " + FB.UserId + "\nMy name: " + m_facebookName);
				work.state = EWorkingState.DONE;
			});
		}
	}
Пример #40
0
        /// <summary>
        /// </summary>
        /// <param name="arSelected"></param>
        /// <param name="arOpts"></param>
        private static void ShellStopHelper(DataGridViewSelectedRowCollection arSelected, out List<string> arOpts)
        {
            arOpts = null;
            int iWorkCount = arSelected.Count;
            if (iWorkCount < 5)
            {
                foreach (DataGridViewRow dsvc in arSelected)
                {
                    object obj = dsvc.DataBoundItem;
                    var objz = (WmiServiceObj) obj;
                    bool aRet = ShellHelper.SwitchServiceStatusTo(objz, ServiceControllerStatus.Stopped);

                    if (arOpts == null)
                        arOpts = new List<string>();
                    arOpts.Add(string.Format("{0}->{1}\n", objz.Name, aRet ? "succ" : "fail"));
                }
            }
            else
            {
                //
                const int thrCou = 4; //并发数
                double xt = Math.Ceiling(iWorkCount/(float) thrCou); //周期数

                var device = new WorkThread[thrCou];
                bool bSetMaxThread = ThreadPool.SetMaxThreads(thrCou, thrCou*2);
                if (!bSetMaxThread)
                {
                    Console.WriteLine("Setting max threads of the threadpool failed!");
                }
                for (int i = 0; i < xt; i++)
                {
                    for (int j = 0; j < thrCou; j++)
                    {
                        int iPoint = i*thrCou + j;
                        if (iPoint >= iWorkCount)
                            break;

                        if (arSelected[iPoint].Cells.Count > 1)
                        {
                            var obj = arSelected[iPoint];
                            var objTmp = (WmiServiceObj) obj.DataBoundItem;
                            device[j] = new WorkThread(objTmp);
                            ThreadPool.QueueUserWorkItem(device[j].ThreadPoolCallBack);
                        }
                    }
                }
                Console.WriteLine("Pls Wait for a moment......Current Time:{0}", DateTime.Now.ToLongTimeString());
                //
            }
        }
Пример #41
0
        /**
         * 分词<br>
         * 此方法是线程安全的
         *
         * @param text 待分词文本
         * @return 单词列表
         */
        public List <Term> seg(String text)
        {
            char[] charArray = text.ToCharArray();
            if (HanLP.Config.Normalization)
            {
                CharTable.normalization(charArray);
            }
            if (config.threadNumber > 1 && charArray.Length > 10000)    // 小文本多线程没意义,反而变慢了
            {
                List <String> sentenceList  = SentencesUtil.toSentenceList(charArray);
                String[]      sentenceArray = sentenceList.ToArray();
                //noinspection unchecked
                List <Term>[] termListArray = new List <Term> [sentenceArray.Length];
                int           per           = sentenceArray.Length / config.threadNumber;
                WorkThread[]  threadArray   = new WorkThread[config.threadNumber];
                for (int i = 0; i < config.threadNumber - 1; ++i)
                {
                    int from = i * per;
                    //threadArray[i] = new WorkThread(sentenceArray, termListArray, from, from + per);
                    //threadArray[i].start();
                }
                threadArray[config.threadNumber - 1] = new WorkThread(sentenceArray, termListArray, (config.threadNumber - 1) * per, sentenceArray.Length);
                //threadArray[config.threadNumber - 1].start();
                try
                {
                    foreach (WorkThread thread in threadArray)
                    {
                        //thread.join();
                    }
                }
                catch (Exception e)
                {
                    //logger.severe("线程同步异常:" + TextUtility.exceptionToString(e));
                    //return Collections.emptyList();
                }
                List <Term> termList = new List <Term>();
                if (config.offset || config.indexMode)  // 由于分割了句子,所以需要重新校正offset
                {
                    int sentenceOffset = 0;
                    for (int i = 0; i < sentenceArray.Length; ++i)
                    {
                        foreach (Term term in termListArray[i])
                        {
                            term.offset += sentenceOffset;
                            termList.Add(term);
                        }
                        sentenceOffset += sentenceArray[i].Length;
                    }
                }
                else
                {
                    foreach (List <Term> list in termListArray)
                    {
                        termList.AddRange(list);
                    }
                }

                return(termList);
            }
            //        if (text.length() > 10000)  // 针对大文本,先拆成句子,后分词,避免内存峰值太大
            //        {
            //            List<Term> termList = new LinkedList<Term>();
            //            if (config.offset || config.indexMode)
            //            {
            //                int sentenceOffset = 0;
            //                for (String sentence : SentencesUtil.toSentenceList(charArray))
            //                {
            //                    List<Term> termOfSentence = segSentence(sentence.toCharArray());
            //                    for (Term term : termOfSentence)
            //                    {
            //                        term.offset += sentenceOffset;
            //                        termList.add(term);
            //                    }
            //                    sentenceOffset += sentence.length();
            //                }
            //            }
            //            else
            //            {
            //                for (String sentence : SentencesUtil.toSentenceList(charArray))
            //                {
            //                    termList.addAll(segSentence(sentence.toCharArray()));
            //                }
            //            }
            //
            //            return termList;
            //        }
            return(segSentence(charArray));
        }