我有一个Windows服务,该服务接受来自.NET Web API的请求(通过RequestSocket(每个客户请求一个)。它将退出其他外部服务,然后将请求的结果返回给客户端。 / p>
该服务的Start方法在其自己的线程上启动RouterSocket。
public void Start()
{
System.Threading.Tasks.Task.Run(() => NetMqServer.GetInstance().StartServer());
}
问题1 :可以在自己的线程上启动NETMQ吗?
NetMqServer是单例类。在StartServer方法中,我们从这里开始侦听来自客户端的请求。
public class NetMqServer : IDisposable
{
private RouterSocket _socket;
...
public void StartServer()
{
_socket = new RouterSocket();
_socket.Bind(_netmqConnStr);
while (_listening)
{
var msg = _socket.ReceiveMultipartMessage();
var identity = msg.Pop().ConvertToString();
var x = msg.Pop().ConvertToString(); // empty frame
var data = msg.Pop().ConvertToString();
// This is a **fire and forget** method
ProcessMessage.Process(identity, data);
}
}
public async Task SendMessageToClient(string id, int errorCode, string response)
{
NetMQMessage message = new NetMQMessage();
message.Append(System.Text.Encoding.ASCII.GetBytes(id));
message.AppendEmptyFrame();
message.Append(errorCode);
message.Append(response);
_socket.SendMultipartMessage(message);
}
}
问题2:我需要在while循环内进行尝试吗?
当Process方法完成工作时,它将在NetMQServer上调用一个方法以将结果发送回WebAPI,然后WebAPI将数据返回给客户。
public class ProcessMessage
{
private RouterSocket _socket;
public async Task Process(string identity, string data)
{
// Call off to external services
// awaiting the external calls
ProcessResponse(result, identiy);
}
private void ProcessResponse(string message, string identity)
{
// Removed extra logic
// Notice no await... I want to fire and forget.
NetMqServer.GetInstance().SendMessageToClient(identity, 0, message);
}
}
问题3:这是将消息发送回客户端的正确方法吗? SendMessage是异步的,它将在其自己的线程中运行。我一直在阅读,我应该使用RouterSocket一个线程来检索和响应客户端。
谢谢。