F# 参与者无法接收发送到“mailbox.Sender()”的邮件?
我创建了以下测试代码-.NETCore2.1控制台应用程序。它只打印以下消息 TestActor从接收到消息MyTask(“Test1”、“Test1”)[akka://MySystem/user/Scheduler#1426101451] 但是参与者调度程序无法接收消息F# 参与者无法接收发送到“mailbox.Sender()”的邮件?,f#,akka.net,akka.fsharp,F#,Akka.net,Akka.fsharp,我创建了以下测试代码-.NETCore2.1控制台应用程序。它只打印以下消息 TestActor从接收到消息MyTask(“Test1”、“Test1”)[akka://MySystem/user/Scheduler#1426101451] 但是参与者调度程序无法接收消息Ok 0 open System open Akka.FSharp open Akka type MyTask = MyTask of item1: string * item2: string let system =
Ok 0
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
开放系统
打开Akka.FSharp
开放阿克卡
键入MyTask=MyTask of item1:string*item2:string
让system=system.create“MySystem”]
让主argv=
让actor=spawn系统“TestActor”处理器
生成系统“调度程序”(调度程序参与者)|>忽略
system.WhenTerminated.Wait()
0
更新:
在我将参数从
(邮箱:Actor)
更改为(邮箱:Actor)
?调度程序不是处理器答复的MyTask
消息的发送者后,它就工作了,因为您是从Actor计算外部执行tell()。这意味着它基本上是在没有发送者的情况下发送的。您可以使用IActorRef
上的Tell
方法与显式发送方一起发送,因为您希望从参与者计算的上下文之外发送:
actors.Tell(MyTask(“Test1”、“Test1”)、mailbox.Self)
编辑
另一个问题是调度程序的邮箱
参数被键入为参与者
,但由于确定0
将在上下文中被推断为结果
,因此它与参与者类型签名不匹配,消息将被忽略。定义具有特定消息类型的参与者时,任何不同类型的消息都将被忽略。我使用邮箱.Self尝试了它,但它仍然不起作用。但是,在我将参数从(邮箱:Actor)
更改为(邮箱:Actor)
之后,它就可以工作了?哦,对了。您的参与者类型还限制了该参与者可以接收的消息Ok 0
可能被推断为ResultBTW,我发现没有必要使用actors.Tell(MyTask(“Test1”、“Test1”)、mailbox.Self)
<代码>发送器工作正常。即使我将type参数更改为Actor
,我的真实代码仍然不起作用。仍在调查中。