public Actor(IServiceProvider container, IActorGet actorGet, ActorScheduler actorScheduler, ActorController instance) { this.ActorGet = actorGet; this.ActorController = instance; var options = instance.GetType().GetCustomAttributes <ActorOptionAttribute>(false); Option = new ActorOptionAttribute(); foreach (var attr in options) { if (attr is ActorOptionAttribute option) { Option = option; } } this.ActorScheduler = Option.SchedulerType switch { SchedulerType.None => actorScheduler, SchedulerType.LineByLine => ActorScheduler.LineByLine, SchedulerType.TaskFactory => ActorScheduler.TaskFactory, SchedulerType.TaskRun => ActorScheduler.TaskRun, _ => actorScheduler }; maxQueuelen = Option.MaxQueueCount; ActorController.ActorGet = ActorGet; ActorController.Status = this; this.Container = container; actorRunQueue = new Lazy <ConcurrentQueue <ActorMessage> >(); Log = new DefaultLog(container.GetRequiredService <ILoggerFactory>().CreateLogger($"Actor-{instance.GetType().Name}")); this.CmdDict = LoadRegister(instance.GetType()); }
private Task Runing() { if (Interlocked.Exchange(ref status, Open) == Idle) { async Task RunNext() { try { while (ActorRunQueue.TryDequeue(out ActorMessage msg)) { try { var res = await Call_runing(msg); msg.Completed(res); LastRunTime = Environment.TickCount; if (CompletedEvent != null) { if (msg.Cmd != SleepCmd) { msg.CompleteTime = TimeHelper.GetTime(); CompletedEvent(ActorController, msg); } } if (status == Disposed) { break; } } catch (Exception er) { msg.SetException(er); } } } finally { Interlocked.CompareExchange(ref status, Idle, Open); } }; return(ActorScheduler.Scheduler(RunNext)); } return(Task.CompletedTask); }