Актер не может получить сообщение, отправленное на `mailbox.Sender ()`?

Я создал следующий тестовый код - консольное приложение.Net core 2.1. Печатает только следующее сообщение

TestActor получил сообщение MyTask ("Test1","Test1") от [akka://MySystem/user/Scheduler#1426101451]

Но сообщение Ok 0 не может быть получено актером scheduler?

open System
open Akka.FSharp
open Akka

type MyTask = MyTask of item1: string * item2: string 

let system = System.create "MySystem" <| Configuration.load ()

let scheduler (actors: Actor.IActorRef) (mailbox: Actor<Result<int, string>>) =
    let rec loop (list: int list list) = actor {
        let! m = mailbox.Receive ()
        let sender = mailbox.Sender ()
        let akkaName = mailbox.Self.Path.Name
        printfn "%s received message %A from %A" akkaName m sender
        return! loop []
    }
    actors <! MyTask("Test1", "Test1")
    loop []

let processor (mailbox: Actor<MyTask>) =
    let rec loop () = actor {
        let! m = mailbox.Receive ()
        let sender = mailbox.Sender ()
        let akkaName = mailbox.Self.Path.Name
        printfn "%s received message %A from %A" akkaName m sender
        sender <! Ok 0 // scheduler cannot receive this message?
        return! loop ()
    }
    loop ()

[<EntryPoint>]
let main argv =
    let actor = spawn system "TestActor" processor
    spawn system "Scheduler" (scheduler actor) |> ignore
    system.WhenTerminated.Wait()
    0

Обновить:

Это работает после того, как я изменил параметр с (mailbox: Actor<Result<int, string>>) в (mailbox: Actor<_>)?

1 ответ

scheduler не отправитель MyTask сообщение на которое processor отвечает, потому что вы делаете сказать (<!) извне актер вычислений. Это означает, что он в основном отправляется без отправителя. Вы можете использовать Tell метод на IActorRef отправить с явным отправителем, так как вы хотите отправить его вне контекста вашего вычисления актера:

actors.Tell(MyTask("Test1", "Test1"), mailbox.Self)

РЕДАКТИРОВАТЬ

Другая проблема заключается в том, что mailbox параметр к scheduler набирается как Actor<Result<int, string>>, но с тех пор Ok 0 будет выведено как Result<int,obj> в вашем контексте это не будет соответствовать сигнатуре типа актера, и сообщение будет проигнорировано. При определении субъекта с определенным типом сообщения любые сообщения другого типа будут игнорироваться.

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