C# iactorref.tell是否可以从多线程的actor外部调用

C# iactorref.tell是否可以从多线程的actor外部调用,c#,akka.net,C#,Akka.net,多线程调用akka.net中的IactorRef.tell可以吗? 当然,传递给tell方法的消息是不可变的 ActorRef.Tell线程安全吗 示例:(下面的代码正确吗?) class Program { static void Main(string[] args) { Props props = Props.Create<PrintMyActorRefActor>(); var sys

多线程调用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);
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
Props Props=Props.Create();
var sys=ActorSystem.Create(“sys”);
var-actorRef=sys.ActorOf(道具,“工人”);
对于(int i=0;i<21;i++)
{
//传递到tell方法的消息将是不可变的
int j=i;
Task.Factory.StartNew(()=>
{
ActorRefs.Tell(“printit”+j,ActorRefs.NoSender);
});
}
Console.ReadLine();
}
}
公共类PrintMyActorRefActor:非类型转换器
{
受保护的覆盖无效OnReceive(对象消息)
{
字符串msgStr=message==null?”:message.ToString();
控制台写入线(msgStr);
}
}

是的,
Tell
消息是线程安全的,并维持两个参与者之间的顺序-因此,参与者A
Tell
将一些消息发送给参与者B可以指望它们按发送顺序发送-但不能跨多个参与者

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


代码的另一个特点是不需要包装
actor。使用
Task告诉
:是actor的基本概念之一,因此发送消息不会阻止执行线程。

“代码的另一个特点是不需要包装actor。使用Task告诉”:我认为多线程示例应该有助于澄清问题。从不同线程同时使用同一个ActorRef实例告诉消息是否安全?是的,ActorRef是线程安全的,您可以从任意数量的线程(或远程场景中的机器)向它发送消息。这些消息在内部排队,并由参与者逐个处理。请记住,只有在同一发送者线程的范围内才能保证消息的顺序。