【问题标题】:ZeroMQ thread/task adviceZeroMQ 线程/任务建议
【发布时间】:2018-12-12 16:18:32
【问题描述】:

我有一个任务正在为我的 Sub/Pub 模式运行此方法。我看到的问题是这个循环将挂起,直到收到数据。如果我想更改主题或 IP,我无法完成此任务。如果我使用线程,我可以杀死它 - 但这似乎是一个丑陋的解决方案。有没有一种很好的异步方式来设置订阅者的接收端。

ReceiveTask = new Task(ReceiveData);
ReceiveTask.Start();

private void ReceiveData()
{
    while (true)
    {
        byte[] messageTopicReceived = SubSocket.ReceiveFrameBytes();
        byte[] messageReceived = SubSocket.ReceiveFrameBytes();
    }
    //Code that uses byte array and do stuff
}

【问题讨论】:

    标签: c# .net sockets zeromq netmq


    【解决方案1】:

    您可以改为调用 Try 扩展程序,它具有以下签名:

    public static bool TryReceiveFrameBytes([NotNull] this IReceivingSocket socket, TimeSpan timeout, out byte[] bytes)
    

    这将允许您将TimeSpan.Zero 作为timeout 传递,这将使其成为非阻塞调用。使用while(true) 可以正常工作,但您可能需要在其中添加Task.DelayThread.SleepTask.Delay 会工作得最好,因为它接受 CancellationToken。可以从不同的线程取消该令牌以快速退出循环。大致如下:

    private void ReceiveData(CancellationToken cancellationToken)
    {
        while (true)
        {
            bool receivedTopicMessage = SubSocket.TryReceiveFrameBytes(TimeSpan.Zero, out byte[] messageTopicReceived);
            bool receivedMessage = SubSocket.TryReceiveFrameBytes(TimeSpan.Zero, out byte[] messageReceived);
    
            Task.Delay(1000, cancellationToken);
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }
        }
        //Code that uses byte array and do stuff
    }
    

    【讨论】:

    • 我做了这个 bool worked1 = SubSocket.TryReceiveFrameBytes(TimeSpan.FromSeconds(1), out topic); bool worked2 = SubSocket.TryReceiveFrameBytes(out bytes); if (!worked1 || !worked2) continue; 工作得很好!
    猜你喜欢
    • 2016-03-13
    • 2013-01-25
    • 2012-06-15
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多