簡體   English   中英

ReceiveActor 接收<t>在 Akka.net 中不起作用</t>

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

我是 Akka.net 的新手,我在 linux 上運行並使用 .NET Core 3.1,我編寫了一個非常簡單的代碼,但它不起作用,我不知道為什么。

這是我的 program.cs,我在其中創建了 ActorSystem 並簡單地調用了另一個演員

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發送一條消息,然后在 Actor 有機會處理消息之前立即退出程序。

您可以在您的示例中暫停主線程(使用例如Console.ReadLine() ),或者 - 如果您需要確保演員在繼續之前處理了消息 - 使用actor.Ask(message, cancellationToken)的組合調用方(將返回 Task,一旦actor發送回響應就完成)和 Actor 的接收方法中的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));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM