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

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

0 голосов
/ 12 декабря 2018

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

Вместо этого вы можете вызвать расширение 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
}
...