将ZMQ套接字轮询的C#代码转换为F#

时间:2016-10-21 02:29:43

标签: f# zeromq c#-to-f#

我的问题是将{#3}} stackoverflow问题的答案转换为F#。我正在使用this包。

这是C#的一部分(来自链接帖子的答案):

ZSocket[] sockets = { receiver1, receiver2 };

ZPollItem[] pollItems = { ZPollItem.CreateReceiver(), ZPollItem.CreateReceiver() };

ZError error;
ZMessage[] msg;

while (true)
{
    if (sockets.PollIn(pollItems, out msg, out error, timeout))
    {
        if (msg[0] != null)
        {
            // The first message gotten from receiver1
        }

        if (msg[1] != null)
        {
            // The second message gotten from receiver2
        }
    }
}

以下是我对翻译的尝试:

let ctx = new ZeroMQ.ZContext()

let sub1 = new ZeroMQ.ZSocket(ctx, ZeroMQ.ZSocketType.SUB)
sub1.SubscribeAll()
sub1.Connect("tcp://localhost:3001")

let sub2 = new ZeroMQ.ZSocket(ctx, ZeroMQ.ZSocketType.SUB)
sub2.SubscribeAll()
sub2.Connect("tcp://localhost:3002")

let timeout = System.TimeSpan.FromMilliseconds(10.)
let sockets = [|sub1; sub2|]
let pollItems = [|ZeroMQ.ZPollItem.CreateReceiver(); ZeroMQ.ZPollItem.CreateReceiver()|]

let mutable error = ZeroMQ.ZError
let mutable msg = Array.init<ZeroMQ.ZMessage> 2    // ??? C#:  ZMessage[] msg;

while true do

    if ZeroMQ.ZPollItems.PollIn(pollItems, &msg, &error, timeout) then   // no overloads match
        if msg.[0] <> null then
            () // work

        if msg.[1] <> null then
            () // work

    ()

如果在F#中正确定义ZMessage[] msg,则PollIn方法行上的无过载错误可能会解决。我认为图书馆本身就是重点,但如果需要,我很乐意提供进一步的细节。我的主要问题是我不了解C#并且几乎不了解F#。

1 个答案:

答案 0 :(得分:1)

正如编译器所写 - 没有这样的过载。只需看看函数期望收到的内容:

  1. 您忘记将套接字指定为第一个参数。

  2. 超时必须是Nullable类型:

  3. 因此...

    open ZeroMQ
    open System
    
    let ctx = new ZContext()
    
    let sub1 = new ZSocket(ctx, ZSocketType.SUB)
    sub1.SubscribeAll()
    sub1.Connect("tcp://localhost:3001")
    
    let sub2 = new ZSocket(ctx, ZSocketType.SUB)
    sub2.SubscribeAll()
    sub2.Connect("tcp://localhost:3002")
    
    let timeout = TimeSpan.FromMilliseconds(10.) |> Nullable
    let sockets = [|sub1; sub2|]
    let pollItems = [|ZPollItem.CreateReceiver(); ZPollItem.CreateReceiver()|]
    
    let mutable error = null
    let mutable msg = null 
    
    while true do
    
        if ZPollItems.PollIn(sockets, pollItems, &msg, &error, timeout) then 
            if msg.[0] <> null then
                () // work
    
            if msg.[1] <> null then
                () // work
    
        ()