Akka.net 中的 ReceiveActor Receive<T> 不工作

ReceiveActor Receive<T> in Akka.net is not working

我是 Akka.net 的新手,我是 linux 上的 运行 并使用 .NET Core 3.1,我编写了一个非常简单的代码,但它不起作用,我不知道为什么.

这是我的 program.cs 我在其中创建了 ActorSystem 并简单地调用了另一个 actor

using Akka.Actor;

namespace PBFT
{
    class Program
    {
        static void Main(string[] args)
        {
            
            var MyActorSystem = ActorSystem.Create("ActorSystem");
            var Primary = MyActorSystem.ActorOf<PrimaryActor>();

            Primary.Tell("Test");
        }
    }
}

这是第一个应该接收消息并将其输出到控制台的演员

using Akka.Actor;
using Akka;
using Akka.Event;

namespace PBFT
{
    class PrimaryActor : ReceiveActor
    {
        private readonly ILoggingAdapter log = Context.GetLogger();
        public PrimaryActor()
        {
            Receive<string>(message => System.Console.WriteLine(message));
        }
    }
}

问题是没有错误,消息没有被 Actor 处理,我是不是遗漏了什么?

Akka.NET 中参与者之间的消息是异步传递的。在您的示例中,您正在 Tell 向演员发送消息并在演员有机会处理消息之前立即退出程序。

您可以在您的示例中挂起主线程(例如使用 Console.ReadLine()),或者 - 如果您需要确保 actor 在继续之前处理了消息 - 使用 [=13= 的组合] 在调用方(这将 return 任务,一旦演员发回响应就完成)和 Sender.Tell(response) 在演员的接收方法中:

class PrimaryActor : ReceiveActor
{
    private readonly ILoggingAdapter log = Context.GetLogger();
    public PrimaryActor()
    {
        Receive<string>(message => {
            System.Console.WriteLine(message);
            Sender.Tell(new object()); // or any other response you want
        });
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        
        var MyActorSystem = ActorSystem.Create("ActorSystem");
        var Primary = MyActorSystem.ActorOf<PrimaryActor>();

        await Primary.Ask<object>("Test", default(CancellationToken));
    }
}