Issue
У меня есть служба Windows, которая принимает запросы от .NET Web API (через RequestSocket (по одному на запрос клиента). Она будет вызывать другие внешние службы, а затем возвращать результатызапрос к клиенту.
Метод запуска службы запускает 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, который, в свою очередь, возвращает данные обратноклиент.
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 один поток, чтобы получать и отвечать клиентам.
Спасибо.