ZeroMQ поток / совет задачи

У меня есть задача, которая запускает этот метод для моего шаблона 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 ответ

Решение

Вместо этого вы можете вызвать расширение Try, оно имеет следующую подпись:

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

Это позволило бы вам пройти TimeSpan.Zero как timeout что сделает это неблокирующим вызовом. С while(true) это будет работать нормально, но вам, вероятно, нужно добавить Task.Delay или же Thread.Sleep там. Task.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
}
Другие вопросы по тегам