public async Task ApplyAction(Func <IEnumerator <Task> > action)
        {
            lock (_actionList)
            {
                var name = Guid.NewGuid().ToString();
                _actionList.Add(name, action);

                CoroutineLocalContainer.Generate(name);
            }
            await Task.FromResult(0);
        }
        public async Task Run()
        {
            Dictionary <string, IEnumerator <Task> > taskList = new Dictionary <string, IEnumerator <Task> >();


            //获取每个动作的迭代器,加入任务列表中
            lock (_actionList)
            {
                foreach (var item in _actionList)
                {
                    taskList.Add(item.Key, item.Value());
                }
            }

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

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

                                CoroutineLocalContainer.Remove(taskItem.Key);

                                throw taskItem.Value.Current.Exception;
                            }
                        }
                    }

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

                            throw;
                        }

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

                            CoroutineLocalContainer.Remove(taskItem.Key);

                            break;
                        }
                    }
                }



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


                if (waitTasks.Count > 0)
                {
                    Task.WaitAny(waitTasks.ToArray());
                }
            }

            await Task.FromResult(0);
        }
 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> > >());
            }
        }