![](/img/trans.png)
[英]What's difference between UntypedActor and ReceiveActor in Akka.Net?
[英]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.