internal void Talk(Actor sender, Actor?receiver, ActorAddress receiverAddress, object message) { if (receiver == null) { if (receiver !.GetAddress().IsUsable) { Undelivered.Add(new Envelope(sender, receiverAddress, message)); } return; } lock (receiver.MatchList) { //Deliver to all subscribing functions. var delivered = false; if (receiver.MatchList.Count > 0) { //Any function may change the list, so a copy is needed. var ml = receiver.MatchList.ToArray(); foreach (var t in ml) { if (t.IsMatch(message)) { var receiveProcess = t.GetReceiveProcess(receiver); if (receiveProcess == null) { continue; } receiveProcess(sender, t, message); delivered = true; } } } if (!delivered) { receiver.Other(sender, null, message); } } }
internal Envelope(Actor sender, ActorAddress actorAddress, object message) { Sender = sender; ActorAddress = actorAddress; Message = message; }
internal Envelope(Actor sender, Type receiverType, string receiverName, object message) { Sender = sender; ActorAddress = new ActorAddress(receiverType, receiverName); Message = message; }