我有一个任务正在为我的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
}
答案 0 :(得分: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
}