Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 参与者无法接收发送到“mailbox.Sender()”的邮件?_F#_Akka.net_Akka.fsharp - Fatal编程技术网

F# 参与者无法接收发送到“mailbox.Sender()”的邮件?

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 =

我创建了以下测试代码-.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 = 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
,我的真实代码仍然不起作用。仍在调查中。