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);
}
}
答案 0 :(得分:1)
是的,Tell
消息是线程安全的,并保持两个参与者之间的顺序-因此,参与者 A Tell
向参与者 B 发送了一些消息>可以指望它们按发送顺序被交付-但不能跨多个参与者。
消息必须是不可变的,或者至少您作为用户必须保证不会从其他位置访问消息的可变组件(因此,一旦发送,接收方是该数据的所有者)。
您的代码的另一件事是,您不需要将actor.Tell
用Task
包装:asynchronous message passing是参与者的基本概念之一,因此发送消息不会t阻止执行线程。