ZeroMQ线程/任务建议

时间:2018-12-12 07:24:40

标签: c# .net sockets zeromq netmq

我有一个任务正在为我的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
}

1 个答案:

答案 0 :(得分: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
}