可以从多线程的actor外部调用iactorref.tell吗

时间:2019-07-19 01:57:47

标签: c# akka.net

akka.net中的IactorRef.tell可以被多线程调用吗? 当然,传递给tell方法的消息将是不可变的

ActorRef.Tell线程是否安全?

示例:(以下代码正确吗?)

 class Program
    {
        static void Main(string[] args)
        {
            Props props = Props.Create<PrintMyActorRefActor>();
            var sys = ActorSystem.Create("Sys");
            var actorRef = sys.ActorOf(props, "worker");

            for (int i = 0; i < 21; i++)
            {
//the message passed into tell method will be immutable
                int j = i;
                Task.Factory.StartNew(() =>
                {
                    actorRef.Tell("printit" + j, ActorRefs.NoSender);
                });
            }
            Console.ReadLine();

        }
    }


    public class PrintMyActorRefActor : UntypedActor
    {
        protected override void OnReceive(object message)
        {
            string msgStr = message == null ? "" : message.ToString();

            Console.WriteLine(msgStr);
        }
    }

1 个答案:

答案 0 :(得分:1)

是的,Tell消息是线程安全的,并保持两个参与者之间的顺序-因此,参与者 A Tell向参与者 B 发送了一些消息>可以指望它们按发送顺序被交付-但不能跨多个参与者。

消息必须是不可变的,或者至少您作为用户必须保证不会从其他位置访问消息的可变组件(因此,一旦发送,接收方是该数据的所有者)。

您的代码的另一件事是,您不需要将actor.TellTask包装:asynchronous message passing是参与者的基本概念之一,因此发送消息不会t阻止执行线程。