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
}