public virtual void Register <T>(Action <T> action) where T : class { var handlesType = HandleValueTypeMessage(typeof(T)); bool decorateActorWithMailbox = LocalConcurrencyType.OneThreadPerActor == this.LocalConcurrencyType; bool isManyThreads = LocalConcurrencyType.OneActorPerThread == this.LocalConcurrencyType; IActor anonActor = new AnonActor <T>(action); if (decorateActorWithMailbox) { anonActor = new MailBoxActor(anonActor); } //else // anonActor = new AnonActor<T>(action); // For invocation return the anonActor we just created always. ActorInvocationBase invoker = new ActorInvocation <IActor>(() => anonActor); //NOTE: for anonymouse Actions the actor type is the same as the message type if (!_actorTypeToInstatiation.TryAdd(handlesType, invoker)) { throw new FailedToRegisterActorInvocationForActionException(handlesType.ToString()); } if (!_messageTypeToActor.TryAdd(handlesType, anonActor)) { throw new FailedToRegisterActionForTypeException(handlesType.ToString()); } uint iterationCount = (isManyThreads) ? this.Concurrency : 1; try { _actorRegistered.Set(); } catch (SemaphoreFullException) { } }
public void Register <T>(Action <T> action) where T : class { IActor anonActor = new AnonActor <T>(action); ILocalSwitchboard switchBoard = new LocalSwitchboard(LocalConcurrencyType.OneActorPerThread); switchBoard.Operator = this.Operator; _actorToSwitchBoard.TryAdd(anonActor.GetType(), switchBoard); switchBoard.Register(action); foreach (var t in _exceptionTypeToHandler) { switchBoard.Register(t.Key, t.Value); } // for each T we create a new LocalSwitchboard that only operates on that type T }