public CoroutineServiceForCurrentThread()
 {
     CoroutineLocalContainer.Init();
 }
        public CoroutineServiceForMultipleThread(ILoggerFactory loggerFactory, int threadCount = 1)
        {
            _loggerFactory = loggerFactory;

            for (var index = 1; index <= threadCount; index++)
            {
                Action <SemaphoreSlim, List <Func <IEnumerator <Task> > > > doAction = (sem, actions) =>
                {
                    _taskItems.Add(new TaskItem()
                    {
                        ActionList = actions,
                        Task       = new Task(() =>
                        {
                            CoroutineLocalContainer.Init();

                            while (true)
                            {
                                sem.Wait();

                                Dictionary <string, KeyValuePair <Func <IEnumerator <Task> >, IEnumerator <Task> > > taskList = new Dictionary <string, KeyValuePair <Func <IEnumerator <Task> >, IEnumerator <Task> > >();

                                //获取每个动作的迭代器,加入任务列表中
                                lock (actions)
                                {
                                    foreach (var item in actions)
                                    {
                                        var name = Guid.NewGuid().ToString();
                                        CoroutineLocalContainer.Generate(name);
                                        taskList.Add(name, new KeyValuePair <Func <IEnumerator <Task> >, IEnumerator <Task> >(item, item()));
                                    }
                                }

                                while (true)
                                {
                                    List <Task> waitTasks = new List <Task>();
                                    //针对每个任务做处理
                                    foreach (var taskItem in taskList)
                                    {
                                        CoroutineLocalContainer.SetCurrentCoroutineName(taskItem.Key);

                                        bool needMoveNext = true;
                                        if (taskItem.Value.Value.Current != null)
                                        {
                                            if (!taskItem.Value.Value.Current.IsCompleted && !taskItem.Value.Value.Current.IsCanceled && !taskItem.Value.Value.Current.IsFaulted)
                                            {
                                                waitTasks.Add(taskItem.Value.Value.Current);
                                                needMoveNext = false;
                                            }
                                            else
                                            {
                                                if (taskItem.Value.Value.Current.Exception != null)
                                                {
                                                    taskList.Remove(taskItem.Key);
                                                    lock (actions)
                                                    {
                                                        actions.Remove(taskItem.Value.Key);
                                                    }

                                                    CoroutineLocalContainer.Remove(taskItem.Key);

                                                    LoggerHelper.LogError(_errorCategoryName, $"CoroutineServiceForMultipleThread error,message:{taskItem.Value.Value.Current.Exception.Message},stacktrace:{taskItem.Value.Value.Current.Exception.StackTrace}");
                                                    break;
                                                }
                                            }
                                        }

                                        if (needMoveNext)
                                        {
                                            bool result;
                                            try
                                            {
                                                //运行到下一个断点
                                                result = taskItem.Value.Value.MoveNext();
                                            }
                                            catch (Exception ex)
                                            {
                                                taskList.Remove(taskItem.Key);
                                                lock (actions)
                                                {
                                                    actions.Remove(taskItem.Value.Key);
                                                }

                                                CoroutineLocalContainer.Remove(taskItem.Key);

                                                LoggerHelper.LogError(_errorCategoryName, $"CoroutineServiceForMultipleThread error,message:{ex.Message},stacktrace:{ex.StackTrace}");
                                                break;
                                            }

                                            //如果已经运行到结束了,则从列表中移除
                                            if (!result)
                                            {
                                                taskList.Remove(taskItem.Key);
                                                lock (actions)
                                                {
                                                    actions.Remove(taskItem.Value.Key);
                                                }

                                                CoroutineLocalContainer.Remove(taskItem.Key);

                                                break;
                                            }
                                        }
                                    }



                                    if (taskList.Count == 0)
                                    {
                                        break;
                                    }


                                    if (waitTasks.Count > 0)
                                    {
                                        Task.WaitAny(waitTasks.ToArray());
                                    }
                                }
                            }
                        }
                                              ,
                                              TaskCreationOptions.LongRunning
                                              ),
                        Semaphore = sem
                    });
                };

                doAction(new SemaphoreSlim(0, 1), new List <Func <IEnumerator <Task> > >());
            }
        }