C# 如何在akka.net的事件处理程序中发送消息?

C# 如何在akka.net的事件处理程序中发送消息?,c#,akka.net,C#,Akka.net,我有一个演员,他有一个定制的计时器,以非实时的间隔触发事件。(这就是我无法使用调度程序的原因) 在事件处理程序中,我想向self或其他参与者发送消息。我收到一个NotSupportedException 我有一个自定义的时间源,类似于nodatimefakeclock类 public class NodaTimeControllableClock { public void AddInterval(Duration interval); public Instant Now {

我有一个演员,他有一个定制的计时器,以非实时的间隔触发事件。(这就是我无法使用调度程序的原因) 在事件处理程序中,我想向self或其他参与者发送消息。我收到一个NotSupportedException

我有一个自定义的时间源,类似于nodatimefakeclock类

public class NodaTimeControllableClock
{
    public void AddInterval(Duration interval);
    public Instant Now { get; protected set; }
    public event EventHandler<TimeChangedEventArgs<Duration>> TimeChanged;
}     

发送事件消息的模式是什么?是否存在任何问题?

您的问题可能源于
Self
Timer\u Timer选中的
内部进行的成员呼叫。原因是
Self
就像
Context
一样,是一个计算属性,仅在当前执行的参与者线程中可用。如果从外部调用它(与计时器回调类似的另一个线程),它可能未初始化

弱解决方案只是将对
Self
的引用存储在其他字段中,并使用该字段发送消息

在您的情况下,更好的解决方案是使用内置的Akka.NET调度器,它提供在指定时间间隔内执行操作或调用的能力:

class MyActor : ReceiveActor
{
    private readonly ICancelable cancelTimer;

    public MyActor()
    {
        var interval = TimeSpan.FromSeconds(1);
        cancelTimer = Context.System.Scheduler
            .ScheduleTellRepeatedlyCancelable(interval, interval, Self, new SomeMessage(), ActorRefs.NoSender);
    }

    protected override void PostStop()
    {
        cancelTimer.Cancel();
        base.PostStop();
    }
}

您问题的根源可能是
Self
Timer\u Timer检查
内进行的成员呼叫。原因是
Self
就像
Context
一样,是一个计算属性,仅在当前执行的参与者线程中可用。如果从外部调用它(与计时器回调类似的另一个线程),它可能未初始化

弱解决方案只是将对
Self
的引用存储在其他字段中,并使用该字段发送消息

在您的情况下,更好的解决方案是使用内置的Akka.NET调度器,它提供在指定时间间隔内执行操作或调用的能力:

class MyActor : ReceiveActor
{
    private readonly ICancelable cancelTimer;

    public MyActor()
    {
        var interval = TimeSpan.FromSeconds(1);
        cancelTimer = Context.System.Scheduler
            .ScheduleTellRepeatedlyCancelable(interval, interval, Self, new SomeMessage(), ActorRefs.NoSender);
    }

    protected override void PostStop()
    {
        cancelTimer.Cancel();
        base.PostStop();
    }
}

你能提供一些简单的片段吗?完成了。这提供了足够的细节吗?你能提供一些简单的片段吗?完成。这是否提供了足够的细节?我很想使用Scheduler,但它使用实时时钟,对吗?甚至可以用我自己的实现来代替它吗?出于测试的目的(Akka.TestKit),有一个实现虚拟时间的实现:你基本上可以调用
调度器.Advance
按指定的时间向前移动。我正在编写一个模拟器,其中时间控制是应用程序的一部分。我很喜欢使用调度器,但它使用实时时钟,对吗?甚至可以用我自己的实现来代替它吗?出于测试目的(Akka.TestKit),有一个实现虚拟时间的实现:你基本上可以调用
Scheduler.Advance
按指定的时间向前移动。我正在编写一个模拟器,其中时间控制是应用程序的一部分。
class MyActor : ReceiveActor
{
    private readonly ICancelable cancelTimer;

    public MyActor()
    {
        var interval = TimeSpan.FromSeconds(1);
        cancelTimer = Context.System.Scheduler
            .ScheduleTellRepeatedlyCancelable(interval, interval, Self, new SomeMessage(), ActorRefs.NoSender);
    }

    protected override void PostStop()
    {
        cancelTimer.Cancel();
        base.PostStop();
    }
}