Отправитель Akka.net о неакторном контексте

Моя система актеров инициализируется в консольном приложении. Я настраиваю один вызов актера BankAccrountActor, который отвечает за обработку транзакции по банковскому счету, например, за счет кредита / дебета / баланса счета. По команде кредит / дебет актер зачисляет сумму кредита / дебет со счета и Sender.Tell() с оставшимся балансом. Из моего program.cs я вызываю BankAccountActor с просьбой о дебете и получаю баланс с результатом.

Проблема для меня от BankAccountActor, он вызывает Sender.Tell() с балансом. Здесь отправитель - это типы IActorRef, и результат приходит в класс программы, а программа не является актером. Как это возможно?

namespace BankAccount
{
class Program
{
    static void Main(string[] args)
    {
        ActorSystem actorSystem = ActorSystem.Create("BankAccountSystem");
        Props bankAccountAccProps = Props.Create<BankAccountActor>();
        IActorRef bankAccActor = actorSystem.ActorOf(bankAccountAccProps, "abc");

        var remainBalance = bankAccActor.Ask<decimal>(new DebitAccMessage(100)).Result;
    }
}
internal class BankAccountActor : ReceiveActor
{
    private decimal _accBalance = 100;
    public BankAccountActor()
    {
        Receive<DebitAccMessage>(message => Debit(message));
        Receive<CreditAccMessage>(message => Credit(message));
    }
    public void Debit(DebitAccMessage debitMessage)
    {
        _accBalance += debitMessage.Amount;

        Sender.Tell(_accBalance);
    }
    public void Credit(CreditAccMessage debitMessage)
    {
        _accBalance -= debitMessage.Amount;

        Sender.Tell(_accBalance);
    }
}
internal class CreditAccMessage
{
    public CreditAccMessage(decimal amount)
    {
        Amount = amount;
    }
    public decimal Amount { get; private set; }
}
internal class DebitAccMessage
{
    public DebitAccMessage(decimal amount)
    {
        Amount = amount;
    }
    public decimal Amount { get; private set; }
}

}

1 ответ

Это работает, потому что под капотом, Ask создает экземпляр субъекта, который используется только для получения одного сообщения, ожидаемого ответа.

Другие вопросы по тегам