Arhn - архитектура программирования

ReceiveActor Receive‹T› в Akka.net не работает

Я новичок в Akka.net, я работаю на Linux и использую .NET Core 3.1, я написал очень простой код, но он не работает, и я не знаю, почему.

это моя программа.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));
        }
    }
}

проблема в том, что ошибок нет и сообщение не обрабатывается Актером, я что-то упустил?

21.07.2020

Ответы:


1

Сообщения между субъектами в Akka.NET передаются асинхронно. Что происходит в вашем примере, так это то, что вы Tell отправляете сообщение актеру и сразу после этого выходите из программы, прежде чем актер получит возможность обработать сообщение.

Вы можете либо приостановить основной поток (используя, например, Console.ReadLine()) в своем примере, либо - если вам нужно быть уверенным, что актор обработал сообщение, прежде чем двигаться дальше - используйте комбинацию actor.Ask(message, cancellationToken) на стороне вызывающего абонента (которая вернет задачу, которая завершает как только актер отправит ответ обратно) и 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));
    }
}
21.07.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..