gpt4 book ai didi

c# - ZeroMQ线程/任务建议

转载 作者:行者123 更新时间:2023-12-03 12:03:19 25 4
gpt4 key购买 nike

我有一个为我的Sub/Pub模式运行此方法的任务。我看到的问题是,该循环将挂起,直到接收到数据为止。如果我想更改主题或IP,则无法结束此任务。如果我使用线程,我可以将其 kill -但这似乎是一个丑陋的解决方案。有没有一种好的异步方法来设置我的订户的接收端。

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
}

最佳答案

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

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

这将允许您传递 TimeSpan.Zero作为 timeout,这将使其成为非阻塞调用。使用 while(true)可以正常工作,但您可能需要在其中添加 Task.DelayThread.SleepTask.Delay接受 CancellationToken效果最佳。可以从其他线程中取消该 token ,以快速退出循环。遵循以下原则:
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
}

关于c# - ZeroMQ线程/任务建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53737960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com