简体   繁体   English

Akka.net Sender关于非演员的背景

[英]Akka.net Sender On non-actor context

My actor system is initialized on console application. 我的actor系统在控制台应用程序上初始化。 I configure one actor call BankAccrountActor which is responsible for handle bank account transaction like credit/debit/account balance of an Account. 我配置一个演员呼叫BankAccrountActor,负责处理银行账户交易,如账户的信用卡/借记卡/账户余额。 On credit/debit command the actor will credit/debit amount from account and Sender.Tell() with remaining balance. 在信用/借记命令中,参与者将从账户和Sender.Tell()中获得信用/借记金额,余额为余额。 From my program.cs I call BankAccountActor with ask for debit and get balance with result. 从我的program.cs我打电话给BankAccountActor请求借记并与结果保持平衡。

Problem for me is from BankAccountActor it calls Sender.Tell() with balance. 对我来说问题来自BankAccountActor,它调用Sender.Tell()并保持平衡。 Here sender is IActorRef types and result is coming to program class and program is not an actor. 这里sender是IActorRef类型,结果是程序类,程序不是actor。 How it be possible? 怎么可能?

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; }
}

} }

它的工作原理是因为在引擎盖下, Ask创建了一个仅用于接收一条消息的actor实例,即预期的答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM