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> > >()); } }